gpt4 book ai didi

c++ - 我可以通过要删除的对象的回调来删除另一个拥有的对象吗?

转载 作者:太空狗 更新时间:2023-10-29 23:47:16 24 4
gpt4 key购买 nike

我有一个类 (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;,但是有一个指向对象的 boost smartpointer(单独的,有时在 map 中)。我认为如果我在包装对象上调用 delete this,智能指针将无法识别底层对象已被删除。对吗?

由于 delete this(以及我上面的代码)是“危险的”,是否有更安全的方法来解决我的问题?

最佳答案

这实际上与在 willDeleteYourself 中调用 delete this; 一样好。删除后不访问任何成员都可以。

关于c++ - 我可以通过要删除的对象的回调来删除另一个拥有的对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6527287/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com