如果我们假设 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
, or0
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/