使用shared_ptr时未调用DTOR

我遇到了一些非常奇怪的行为。我的一个班级 (Class A) 持有一个 shared_ptr 到一个班级Connector。其他类也持有该Connector实例的shared_ptr 。我注意到Connector在一切都超出范围后,不会调用 's 析构函数。但是,如果我将Connectorin 类A作为引用而不是 shared_ptr,则调用析构函数并且一切正常。

很抱歉没有共享任何代码,但它是大型代码库的一部分,我无法提取较小的相关位。

所以我的问题是:你知道为什么从 shared_ptr 切换到引用成员会以这种方式影响行为吗?也许这与由于各种 shared_ptr 导致的一些循环 DTOR 调用有关?

我很感激你可能有的任何提示!

PS:所有基类都有虚拟 DTOR。这是我检查的第一件事..

回答

当你有一个周期时会发生这种情况。这意味着对象在一个循环中相互指向,因此引用计数永远不会为零。你必须修复循环。C++ 专门有一种weak_ptr在这种情况下使用的类型,这对您的情况也很有用。

但是,如果我将 A 类中的连接器作为引用而不是 a shared_ptr,则调用析构函数并且一切正常。

这可能意味着所有权没有经过深思熟虑,A不应该是所有者。人们经常默认,shared_ptr因为它看起来更容易使用,但实际上,它使所有权系统复杂化。在许多情况下,您可能只有一个所有者对象,持有一个unique_ptr,而其他所有人都可以引用该对象而不拥有它。这可以通过不拥有原始指针等来完成。


以上是使用shared_ptr时未调用DTOR的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>