c++ - weak_ptr 和父子循环依赖

标签 c++ pointers cycle shared-ptr smart-pointers

我目前有类似以下内容:

class Parent
{
    //just a single child... for sake of simplicity
    //no other class holds a shared_ptr reference to child
    shared_ptr<Child> _child; 
    System * getSystem() {...}
}

class Child
{
    weak_ptr<Parent> _parent;
    ~Child 
    { 
        _parent.lock()->getSystem()->blah(); 
    }
}

Child 析构函数总是崩溃,因为当 ~Child() 运行时 _parent 总是过期。是否有针对这种怪现象的典型解决方案?

简而言之,有没有办法在 ~Child 完成之前不销毁 _parent?

最佳答案

因为在调用子对象的析构函数时,父对象的析构函数已经运行(成员对象的 dtor 在包含对象的 dtor 之后运行),即使子对象持有指向父对象的普通指针,在调用 ~Child() 时,调用父级的成员函数将无效。

您可以通过让 Child 在较早的时候调用 getSystem() 并缓存结果来解决这个问题。也许在 Child 的构造函数中(如果它当时有对 parent 的引用)或者也许可以添加一个接口(interface),以便 Parent 可以让 child 知道它需要从当时的 parent 那里收集销毁期间可能需要的任何东西。

我知道这些都不是很好的解决方案(它增加了对象的耦合)-希望有人会发布更好的选择。

关于c++ - weak_ptr 和父子循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4476011/

相关文章:

c++ - 持有多于预期的数组字符

c++ - 为什么只移动对象不能添加显式关键字?

java - C 代码到 Java——字符操作

C++ 帮助学生的指针

Jquery Cycle — 多个嵌套幻灯片和循环终止

javascript - 检查跨度并删除第一个子项

c++ - 使用洋葱而不是结构更好的场景

c++ - 这两个类是否违反封装?

c - 字符串数组末尾为NULL(C编程)

jquery - CSS(也许 Jquery 也是)在页面的第一次加载(在 IE 中)不能正常工作