[问题] 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