關於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 排除這類問題.
請各位分享經驗
謝謝