所以说我有这样一个类:
class A {
public:
A( SomeHugeClass* huge_object)
: m_huge_object(huge_object) {}
private:
SomeHugeClass* m_huge_object;
};
Run Code Online (Sandbox Code Playgroud)
如果有人使用这样的构造函数:
A* foo = new A(new SomeHugeClass());
Run Code Online (Sandbox Code Playgroud)
谁负责在构造函数中新建的对象上调用delete?在这种情况下,调用A构造函数的范围只能删除foo,因为SomeHugeClass是匿名的.
但是,如果有人像这样使用构造函数呢?
SomeHugeClass* hugeObj = new SomeHugeClass();
A* foo = new A(hugeObj);
Run Code Online (Sandbox Code Playgroud)
然后,调用者可以在某个时候调用delete hugeObj,对吗?
A的这种实现是否会破坏内存?
我正在研究一个以这种方式完成大量对象组合的项目,尽管我希望使用智能指针,但我必须与项目负责人讨论如何更改旧代码以便在我可以之前利用它.
我尽可能地遵循这个简单的规则:打电话的人也new应该打电话delete.否则,代码很快就会变得太乱,无法跟踪删除的内容和不删除的内容.
在你的情况下,如果A :: A收到指针,它不能删除它.想想这个简单的案例:
SomeHugeClass* hugeObj = new SomeHugeClass();
A * a1 = new A(hugeObj);
A * a2 = new A(hugeObj);
Run Code Online (Sandbox Code Playgroud)
A类不知道还有谁在使用该指针!
如果你想要A类来处理指针,它应该自己创建它.
当然,你可以处理这两种情况,但这可能是一种矫枉过正,如下所示:
A::A() : own_huge_object(true) {
m_huge_object = new SomeHugeClass();
}
A::A(SomeHugeClass * huge_object ) : own_huge_object(false) {
m_huge_object = huge_object;
}
A::~A() { if(own_huge_object) delete m_huge_object; }
Run Code Online (Sandbox Code Playgroud)