我目前有类似以下内容:
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/