关于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 排除这类问题.
请各位分享经验
谢谢