【问题标题】:shared_ptr not being destroyed when use_cout() == 1当 use_cout() == 1 时 shared_ptr 没有被销毁
【发布时间】:2015-05-26 09:51:56
【问题描述】:

我目前有一个shared_ptr,它的use_count() 为1,因此我希望shared_ptr 会自动销毁(无需调用reset())但是这不会发生。

我的问题是我在这里遗漏了什么吗?是否有任何情况导致shared_ptr 不被销毁?

我的一些类是 GUI 类,它们不包含构造函数或析构函数,并且具有 Init() 和 Shutdown() 函数。对于这种类型的类,shared_ptr 似乎不会被自动销毁。

谢谢,

【问题讨论】:

  • A shared_ptruse_count() 达到 0 时被销毁(这是唯一的 shared_ptr 超出范围)
  • @Xaqq 但是如果use_count() 是1,那么当shared_ptr 超出范围时,use_count() 应该是0,然后应该调用析构函数等等...跨度>
  • 代码 sn-p 怎么样,以便我们发现任何微妙之处?
  • @ShamariCampbell 是的,这正是应该发生的事情。

标签: c++ shared-ptr


【解决方案1】:

从显而易见的开始:如果shared_ptr 的计数为 1,则表示其上仍有一个引用。 实际上,如果您可以访问此引用计数,则意味着您在对象上使用了shared_ptr。因此,在这种情况下,计数为 1 是自然的。

会发生以下情况:如果您在函数中使用本地shared_ptr,则shared_ptr 对象将在函数结束时被销毁。因此,这个指针是对象上的最后一个指针,指向的对象将在函数结束时被销毁。

但是,如果指针以持久的方式存储(比方说:作为在程序的整个生命周期中存在的对象的成员),则引用将始终存在,因此该对象将永远不会被销毁。 解决此问题的一种方法是定期检查引用计数,并在引用计数为 1 时调用 reset()

但是:如果您必须这样做,您处理shared_ptr 对象的方式可能存在问题:您确定需要此引用吗?也许您应该使用weak_ptr 而不是shared_ptr?这样一来,weak_ptr 就不会算作对对象的引用,无论weak_ptr 的数量是多少,它都会被销毁。

这样做,您仍然可以在对象存在时使用weak_ptr 访问该对象,但很明显,当对象被销毁时就不能再访问了。您只需确保该对象在访问它之前仍然存在。这是通过在weak_ptr 上使用lock() 来完成的:它向对象返回shared_ptr,但如果对象不再存在,则此指针可以是nullptr。只需在执行lock() 后检查指针是否为nullptr。或者,您可以使用expired() 函数来检查引用是否仍然有效。

【讨论】:

    猜你喜欢
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    • 2017-05-01
    相关资源
    最近更新 更多