【发布时间】:2011-06-29 21:08:35
【问题描述】:
我有一个班级 (A) 知道什么时候应该删除它。我相信一个对象不能直接删除自己(即,你不能从它内部调用析构函数)所以我使用了回调。
这是我当前解决方案的伪代码:
class A {
Owner* owner; // is set in constructor
A(Owner* ow) : owner(ow) {}
void willDeleteOurself() {
owner->deleteObject();
}
}
class Owner {
A* obj;
Owner() { // e.g. constructor
obj = new A(this);
}
void deleteObject() {
delete obj;
}
}
我有一个 Owner 类的对象,它拥有一个 A 类的对象。现在,在某个时刻,obj“知道”它应该被删除,并调用了willDeleteOurself()。这段代码似乎有效。
现在,我的问题是:这是一种安全的删除方式 obj?
我很担心,因为当deleteObject 方法返回(到达})时,它会跳回到willDeleteOurself() 的末尾,但调用该方法的对象已被销毁。
当我在调用 owner->deleteObject(); 之后没有更多引用 obj 的语句时,此构造是否安全?
更新:
感谢您的回答。我在这里简化了一点。我没有A* obj;,而是一个指向对象的提升智能指针(单独,有时在地图中)。我想如果我在包装对象上调用delete this,智能指针将无法识别底层对象已被删除。对吗?
由于delete this(以及我上面的代码)是“危险的”,有没有更安全的方法来解决我的问题?
【问题讨论】:
标签: c++ object delete-operator