[問題] new 出來 該誰delete的問題?

作者: dreamboat66 (小嫩)   2014-08-13 15:53:38
關於new出來的物件 誰該負責delete的問題 我一直充滿著盲點
因為本身是比較常接觸 managed code, 但我會試著想說用C++該怎麼處理
看一些design pattern的書
以strategy pattern來講
auto ptr = new Foo(new MyStrategy());
這行來看
若是Foo是我寫的 濠可以知道我收到MyStrategy後 要負責delete還是不要 濠很清楚
但假設不是我寫的 而是用別人static library or dll...我真的無從得知
這時候我自己覺得別人沒有義務幫我delete, 所以我可能會在我認為不會再使用Foo的時
候做MyStrategy delete的動作
delete Foo; delete MyStrategy;
若不考慮全面使用smart ptr的話 會面臨到這問題
另一個case是
使用Bar* Factory->GetXXX();我拿到Bar物件後
到底是我該delete還是Factory該提供ReleaseXXX(const Bar* ); 給我用呢?(因為是fact
ory, 提供release很合理,但其他case就語意不清了)
一般人寫document也不會特別註明 她產生的instance他自己會不會去做delete?
以windows來說
因為看書上跟網頁上都描述 若 dll用static link CRT, malloc的話
會因為在不同heap 而無法去delete別的dll new出來的物件
那這樣更是讓我再用他的時候 我根本不知道他是不是static link CRT, 我只會預期他應
該要開release function給我
我自己的歸納是
1. 自己內部new的自己delete這應該的. 別人傳進來的, 若是 我只取他的資料 我就不要
去動他, 外面的人應該知道語意, 會去delete
反之, 若傳進來的是一種dependency...我拿到後 我就應該在我自己毀滅的時候順便把他
給delete了(但這邊就牽扯到我自己是dll的話, 別人(exe)傳進來的東西 我不該delete阿
)...
ꀠꀊ2. 若return 一個pointer的case, 我只能看語意去猜測是否該delete, 我認為好習慣是
對方應該要開對應的release function?
3. document要寫清楚 我是copy一份傳出去 還是return自己內部的物件(加上const讓別
人比較清楚)
以上 其實只是想問
有沒有guideline或是有某一種設計理念可遵循?
實際上在開發 應該盡可能不要有這種相依case->dll吃exe傳的物件
所以自己module下 我自己要很清楚 氽elete該誰做, 所以對方用的時候 並不會有confus
e?
或是在自己模組下盡量套用smart pointer 排除這類問題.
請各位分享經驗
謝謝
作者: uranusjr (←這人是超級笨蛋)   2014-08-13 16:49:00
能用 smart pointer 就用, 不能用的就要靠文件和 namingconvention; 例如會回傳需要 delete 的函式名稱裡要有new 這個字讓使用者有認知等等
作者: Killercat (殺人貓™)   2014-08-13 17:04:00
new/delete再不同scope通常會被認為是嚴重的設計瑕疵這個式相當嚴重的設計錯誤 一定要避免的尤其是expose給user的lib 這通常都不被允許
作者: Feis (永遠睡不著 @@)   2014-08-13 17:37:00
這裡為什麼要 new 呢
作者: dreamboat66 (小嫩)   2014-08-13 19:27:00
抱歉手機排版,怪怪 字會變,遇到bug..
作者: johnpage (johnpage)   2014-08-14 16:49:00
managed code會自動收回, unmanaged code必須自己管控
作者: dreamboat66 (小嫩)   2014-08-14 19:29:00
就是因為managed code都不用考慮這,才會想知道有沒有規範可遵守,不然設計上讓我好頭痛
作者: damody (天亮damody)   2014-08-14 20:00:00
不要new malloc 就不用delete free了啊~你可以請別人幫你new 像是vector之類的
作者: johnpage (johnpage)   2014-08-14 20:05:00
unmanaged code不用管控所以執行比較快, 所以在要求速度的情況下不會用managed code
作者: TeaEEE (愛不趴 不愛趴)   2014-08-15 11:19:00
寫成 auto ptr = new Foo(MyStrategy()); 不就沒delete MyStrategy的問題了嗎
作者: xacid ( )   2014-08-15 11:47:00
Foo(X*)一般都是呼叫者要管理傳入pointer,除非smart_ptr
作者: shadow0326 (非議)   2014-08-15 15:42:00
目前用過的第三方lib c++通常都客戶自己new/deletec通常都提供free_xxx release_xxx uninit_xxx的API
作者: TeaEEE (愛不趴 不愛趴)   2014-08-16 00:39:00
我覺得原Po用c#的object來看c++才會有這種疑問
作者: dreamboat66 (小嫩)   2014-08-16 00:47:00
其實我都用c++去看c#,但我覺得oo都類似,設計上需要多考慮回收的問題讓我找不到一個準則
作者: Feis (永遠睡不著 @@)   2014-08-17 14:24:00
準則就是沒是不要 new. new 的時後給別人 new這裡到底為什麼要 new 呢...用盡方法讓自己不要做這件事情. 真的要做就包起來但是就如 raw pointer 一樣. 需要自己 new 的時機很少

Links booklink

Contact Us: admin [ a t ] ucptt.com