引用计数智能指针如何避免或处理引用计数器溢出?

ser*_*gej 8 c++ smart-pointers integer-overflow refcounting automatic-ref-counting

在一个天真的引用计数智能指针实现中,引用计数器可能会溢出.在C++标准库实现中如何避免或处理这种溢出?

eer*_*ika 6

来自stdlibc ++标题的片段:

typedef int _Atomic_word;

class _Sp_counted_base
    /*snip*/
    _Atomic_word  _M_use_count;
    /*snip*/
    _M_weak_add_ref()
    { __gnu_cxx::__atomic_add_dispatch(&_M_weak_count, 1); }

/*snip*/
__atomic_add_dispatch(/*snip*/)
{
    /*snip*/
    __atomic_add_single(/*snip*/);
    /*snip*/
}

__atomic_add_single(/*snip*/)
{ *__mem += __val; }
Run Code Online (Sandbox Code Playgroud)

结论:这个特定的实现通过忽略可能性来"处理"引用计数器溢出.

  • @BobJansen可能不好.另一个结论是:你不应该让用户输入直接影响没有绑定的共享指针的数量.实际上,我会将其扩展到分配内存(或其他资源)的任何内容. (6认同)
  • 总的来说是的,但是如果攻击者设法产生一些导致程序创建它们的恶意输入呢? (2认同)
  • 我刚看了一下`std :: shared_ptr`的MSVC++ 2017实现.他们叫[`_InterlockedIncrement()`](https://docs.microsoft.com/en-us/cpp/intrinsics/interlockedincrement-intrinsic-functions)的溢出以及. (2认同)