gpt4 book ai didi

c++ - 如何在自己的回调中销毁对象

转载 作者:太空狗 更新时间:2023-10-29 20:39:37 57 4
gpt4 key购买 nike

我有一个管理多个“子”对象生命周期的“父”对象。这些对象会做一些事情,完成后,它们会向其父对象(通过回调)发出信号,表明它们已完成并可以销毁。

一个玩具示例:

#include <list>

class Child;

class IChildListener
{
public:
virtual void on_done(Child *child) = 0;
};

class Child
{
public:
Child(IChildListener *parent)
: m_parent(parent)
{
}

void do_stuff()
{
m_parent->on_done(this);
}

protected:

IChildListener *m_parent;
};

class Parent : public IChildListener
{
public:
void on_done(Child* child) {
m_children.remove(child);
delete child;
}

Child *create_child() {
Child* child = new Child(this);
m_children.push_back(child);
return child;
}
protected:
std::list<Child*> m_children;
};

int main(int argc, char** argv) {

Parent p;

Child *c = p.create_child();

c->do_stuff();
}

问题是,实际上一个子进程在调用它自己的方法时被销毁了,这当然不是一个好主意。有做这些事情的模式吗?

最佳答案

只要 Childon_done() 退出后不访问它自己的任何数据成员,那么 on_done() 是安全的> 删除子对象。它类似于引用计数对象在其引用计数降至 0 时释放自身 - 当调用 delete this 时对象的 Release() 方法仍在运行,但是可以,因为 Release() 在调用 delete 后不会访问任何数据成员。

如果您真的想让它安全,您可以将引用计数添加到您的 Child 类。当 Parent 将一个子项添加到其列表时,增加该子项的引用计数。当 Parent 从其列表中删除一个子项时,减少该子项的引用计数。当Child调用on_done()时,它可以先增加自己的引用计数,然后在on_done()退出后减少引用计数。当引用计数达到 0 时,Child 可以删除 自身。这样,Child 决定何时可以安全地从内存中释放自己,同时仍允许 Parent 管理子级列表。

关于c++ - 如何在自己的回调中销毁对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27303806/

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