引用计数(不存储任何数据)

时间:2014-01-07 15:06:10

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

我需要在我的班级中有一个共享计数器(当计数器变为零时调用某个函数)。 我可以使用带有删除器的shared_ptr<char>,但这种方法有分配不需要的char和保持指针的开销。

基本上,我需要引用计数shared_ptr的一部分。 我不知道如何利用shared_ptr并避免这种开销。

是否有可移植的C ++ 11实现(即,仅使用标准的c ++ 11和std,没有显式的互斥锁等)?

PS。 计数器不是整个班级独有的。我可能有我班级的对象a1,a2,a3共享同一个计数器。与b1,b2,b3共享不同的计数器。所以当a1,a2,a3的最后一个超出范围时(与a1,a2,a3相关)应该发生。当b1,b2,b3中的最后一个超出范围时,应该发生某些事情(与b1,b2,b3相关)。

由于

3 个答案:

答案 0 :(得分:6)

一个简单的atomic<int>就足够了。我认为不需要任何更复杂的东西。

答案 1 :(得分:3)

std::shared_ptr<void> p(nullptr, MyDeleter());

这正是你想要的。

Live example

答案 2 :(得分:1)

试试std::shared_ptr<void> ptr = std::make_shared<char>();。这确实有单字节开销(由于对齐原因可能会进行舍入),但当您使用char创建make_shared时,分配的shared_ptr与引用计数实现在同一个块中}。

另一种方法是使用“退出范围”对象:

struct at_exit_scope {
  std::function<void()> f;
  ~at_exit_scope() { f(); }
  template<typename F>
  at_exit_scope( F&& f_ ):f(std::forward<F>(f_)) {}
  at_exit_scope() = delete;
  at_exit_scope(at_exit_scope const&) = delete;
};

然后做一个shared_ptr<at_exit_scope> ptr = std::make_shared<at_exit_scope>( [=]{ /* code */ } )。这消除了对deleter的需求,并将其替换为std::function的开销。