【问题标题】:Finding weak_ptrs referring to a shared_ptr查找引用 shared_ptr 的 weak_ptrs
【发布时间】:2015-02-22 08:26:45
【问题描述】:

有没有办法找出一个 shared_ptr 被引用的 weak_ptr 的数量?

unique()/use_count() 可用于查找 shared_ptrs,但是否有类似的构造用于查找引用的 weak_ptrs。

只有当没有weak_ptr 引用它时,我才想释放shared_ptr 持有的资源。所以将来某个时候如果我尝试从这个weak_ptr创建一个shared_ptr,我不应该得到一个nullptr。

目前在 C++11 中是否可行?

【问题讨论】:

  • 如果你必须这样做,我会重新检查你的设计
  • "只有在没有weak_ptr 引用的情况下,我才想释放shared_ptr 持有的资源。"那为什么不到处使用 shared_ptr 呢?
  • 他在技术上走错了路,但问题是公平的,反对票的原因是什么?!

标签: c++ c++11 shared-ptr smart-pointers weak-ptr


【解决方案1】:

没有。

做这件事没有接口,因为它会错过整个要点。

如果没有std::shared_ptr 引用资源,则释放该资源。

通过使用std::weak_ptr,您明确允许您的资源被释放。如果这不是您想要的,请不要使用它。

【讨论】:

  • 当最后一个shared_ptr 被销毁时资源被destructed,但在某些情况下它可能不会被释放。例如,如果资源是用std::make_shared 分配的,则某些实现可以将分配对象的控制块和内存组合在一起。在这种情况下,如果你周围有weak_ptrs,那么即使资源在逻辑上被破坏,内存也会泄漏。因此,即使动机错误,知道周围有多少weak_ptr 的需求也是合法的,并且可能对调试有用
  • @gigabytes 虽然是这样,但它是一个实现细节,与使用std::weak_ptr程序 并不真正相关。要求接口知道计数会暴露太多的实现细节,并会限制其他有效的实现。恕我直言,它对调试并不是很有用,因为在你提到的情况下,我宁愿有一个指向同一个控制块的弱指针列表。计数仅告诉您必须找到多少其他人。如果您想查询实现细节,请使用实现为您提供的工具(如调试器)。
  • 这不是实现细节,因为标准允许优化,而这正是 std::make_shared 的主要动机。无论如何,我并不是说该标准应该提供一种方法来查询仍然存在的weak_ptr 的数量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-02
  • 1970-01-01
  • 2017-05-02
  • 1970-01-01
  • 1970-01-01
  • 2013-10-04
  • 1970-01-01
相关资源
最近更新 更多