看板 C_and_CPP 關於我們 聯絡資訊
我用 C 實作一個link list,編譯環境為VS 2008。 struct EVENT{ void* dataPtr; //// 指向malloc出來的data空間 //// EVENT* link; }; struct LIST{ int count; EVENT* pos; EVENT* head; EVENT* rear; int (*compare) (void* argu1, void* argu2); }; ...... 最後,在刪除 LIST 前,我先用C的free(.)來釋放 EVENT 裡面dataPtr指向的記憶體, 然後free(.)掉該 EVENT,最後刪除 LIST。 我想的問題是,如果我的dataPtr吃進來的是一個struct,像這樣: struct EventContent{ int type; AAA* aaa; //// 會指向另一個malloc出來的空間 //// }; 那最後要free(.)掉dataPtr前,因為其狀態為void* 表什麼資料型態通吃, 如果吃到struct時,要free掉這個 EventContent,它只會把 EventContent釋放掉, 裡面的 aaa 指向的記憶體卻會變成垃圾,留在電腦裡直到程式結束。 所以要在刪除dataPtr時,尚需另外寫一行程式刪除dataPtr吃進來的指標, 麻煩的是,還要把 void* 先轉換成 EventContent* 才能free。 如欲將實現與應用切割開,每一次要用這個 LIST 的人, 都要小心吃進來的資料型態有無包含動態記憶配置的指標,不是很麻煩嗎? 有更好的方法可以解決問題嗎? 以C而言..... 謝謝各位! =========== PS. 我想到做法就是用C++ 在 EventContent 放一個解構子, 專門釋放 aaa 指向的記憶體空間: struct EventContent{ int type; AAA* aaa; //// 會指向另一個malloc出來的空間 //// ~EventContent(){ if( aaa != NULL ) free(aaa); } }; 然後產生以及刪除 EventContent 都用new跟delete, 還有,EVENT 的struct就要改成這樣: struct EVENT{ EventContent* dataPtr; //// 指向用new出來的data空間 //// EVENT* link; }; 這樣以後用的話只要針對不同需求建立相對應的 EventContent 的class就好, 不知道這是不是好的做法? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.144.18 ※ 編輯: kkroy 來自: 140.113.144.18 (02/25 14:04) ※ 編輯: kkroy 來自: 140.113.144.18 (02/25 14:07)
VictorTom:解構子是一個方法; 除非有很多不同的type要掛, 不然直接 02/25 14:07
VictorTom:用EventContent*不要用void*不就可以少一層了?? 02/25 14:07
VictorTom:基本上, 自己malloc出來的就要自己free, 你覺得free麻煩 02/25 14:08
VictorTom:的地方在malloc也是同樣的層數, 把流程與操作函數寫好的 02/25 14:08
VictorTom:話, 再麻煩也不過是那個樣子吧....@_@" 02/25 14:08
kkroy:是的,目前我只想到用解構子.... 02/25 14:09
kkroy:但是如果要用C實作,我就不知道該怎麼解決這種問題! 02/25 14:09
kkroy:很感謝V大願意跟我討論~^^b 02/25 14:10
VictorTom:我只是路過嘴砲的~_~ 總覺得非C不可就是自己來吧, 最多 02/25 14:29
VictorTom:就是把操作函數寫得結構化一點, 有點類似模擬C++, 程式 02/25 14:29
VictorTom:的流程: init/setup, operate, DeInit/clean; 如果要考 02/25 14:30
VictorTom:慮多種型態支援, 就再引入func ptr進來; 另外就是 02/25 14:31
VictorTom:comment/manual寫勤一點, 以後自己要用/加功能才清楚@@" 02/25 14:31