[問題] link list 的malloc與free

看板C_and_CPP (C/C++)作者 (☆㊣↖煞氣ㄟ阿喂↘ξ★)時間16年前 (2010/02/25 14:03), 編輯推噓2(2011)
留言13則, 2人參與, 最新討論串1/1
我用 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)

02/25 14:07, , 1F
解構子是一個方法; 除非有很多不同的type要掛, 不然直接
02/25 14:07, 1F

02/25 14:07, , 2F
用EventContent*不要用void*不就可以少一層了??
02/25 14:07, 2F

02/25 14:08, , 3F
基本上, 自己malloc出來的就要自己free, 你覺得free麻煩
02/25 14:08, 3F

02/25 14:08, , 4F
的地方在malloc也是同樣的層數, 把流程與操作函數寫好的
02/25 14:08, 4F

02/25 14:08, , 5F
話, 再麻煩也不過是那個樣子吧....@_@"
02/25 14:08, 5F

02/25 14:09, , 6F
是的,目前我只想到用解構子....
02/25 14:09, 6F

02/25 14:09, , 7F
但是如果要用C實作,我就不知道該怎麼解決這種問題!
02/25 14:09, 7F

02/25 14:10, , 8F
很感謝V大願意跟我討論~^^b
02/25 14:10, 8F

02/25 14:29, , 9F
我只是路過嘴砲的~_~ 總覺得非C不可就是自己來吧, 最多
02/25 14:29, 9F

02/25 14:29, , 10F
就是把操作函數寫得結構化一點, 有點類似模擬C++, 程式
02/25 14:29, 10F

02/25 14:30, , 11F
的流程: init/setup, operate, DeInit/clean; 如果要考
02/25 14:30, 11F

02/25 14:31, , 12F
慮多種型態支援, 就再引入func ptr進來; 另外就是
02/25 14:31, 12F

02/25 14:31, , 13F
comment/manual寫勤一點, 以後自己要用/加功能才清楚@@"
02/25 14:31, 13F
文章代碼(AID): #1BXXA_-W (C_and_CPP)
文章代碼(AID): #1BXXA_-W (C_and_CPP)