c++ - std::shared_ptr 中的最大引用计数是多少?如果你试图超过它会发生什么?

标签 c++ c++11 shared-ptr reference-counting

如果我们假设 std::shared_ptr 存储引用计数(我意识到标准不需要,但我不知道有任何实现不需要),那么引用计数有位数有限,这意味着支持的引用数量有上限。这就引出了两个问题:

  • 这个最大值是多少?
  • 如果你试图超过它会发生什么(例如,通过复制一个引用具有最大引用计数的对象的 std::shared_ptr)?请注意,std::shared_ptr 的复制构造函数声明为 noexcept

该标准是否阐明了这些问题中的任何一个?常见的实现如何,例如 gcc、MSVC、Boost?

最佳答案

我们可以从 shared_ptr::use_count() 函数中获取一些信息。 §20.7.2.2.5 说:

long use_count() const noexcept;

Returns: the number of shared_ptr objects, *this included, that share ownership with *this, or 0 when *this is empty.

[Note: use_count() is not necessarily efficient.—end note ]

乍一看,long 返回类型似乎回答了第一个问题。然而,该注释似乎暗示 shared_ptr 可以自由使用它想要的任何类型的引用计数,包括引用列表之类的东西。如果是这种情况,那么理论上不会有最大引用计数(尽管肯定会有实际限制)。

没有其他关于我能找到的对同一对象的引用数量限制的引用。

有趣的是,use_count 被记录为不抛出和(显然)正确报告计数;除非实现确实使用 long 成员进行计数,否则我看不出如何在理论上始终保证这两者。

关于c++ - std::shared_ptr 中的最大引用计数是多少?如果你试图超过它会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12402116/

相关文章:

c++ - 模板的自定义迭代器

c++ - 我可以在 vector 上创建 View 吗?

c++11 - 我们不能管理 std::map<string,ofstream> 吗?

c++ - C++11 中的混合(List+Dict)容器

c++ - 是否可以将 vector<shared_ptr<T>> 传递给 const vector<shared_ptr<const T>>& 参数?

c++ - 如何将原始数据附加到 boost::shared_array<char>?

c++ - 将 'upserting' 项放入 map<key, shared_ptr<foo>> 的正确方法

c++ - 同步、线程安全接口(interface)的正确锁定模型

c++ - 相互比较文本文件的元素

c++ - 如何在 Berkelium 中启用拖动选择?