C++11 标准指定long
了use_count()
观察者函数的返回类型,但没有明确指定实现是否必须支持2^(sizeof(long)*8-1)-1
共享所有权。
它也没有指定引用计数器溢出时会发生什么。
该boost::shared_ptr
实现(例如 Fedora 23、x86-64 上的 1.58)在内部使用 32 位计数器并且不检查溢出。
这意味着:
- 最大引用计数为
2^31-1
.
- 如果您有溢出和释放所有权,您最终可能会遇到一些释放后使用的问题
由于 boost 对不同平台使用不同的低级专业化,您可以通过设置断点来验证详细信息*add_ref_lock
- 在 Fedora 23/x86-64 上,您将在此处停止:
/usr/include/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp
[..]
int use_count_; // #shared
int weak_count_; // #weak + (#shared != 0)
[..]
bool add_ref_lock() // true on success
{
return atomic_conditional_increment( &use_count_ ) != 0;
}
也可以看看:
GNU STL (libstdc++) shared_pointer 实现基于 Boost 1.32 并且也有这个问题(在 Fedora 23/x86-64 上) - 该_Atomic_word
类型用于引用计数。它也是“仅”32 位的,不检查溢出。
相比之下,LLVM libc++shared_ptr
实现使用 along
作为引用计数器,即在 x86-64 等 LP64 平台上,您可以在最多2^63-1
所有者之间共享一个对象。