作者kkroy (☆㊣↖煞氣ㄟ阿喂↘ξ★)
看板C_and_CPP
標題[問題] link list 的new與free
時間Thu Feb 25 14:03:41 2010
我用 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