shared_ptr和引用计数器

时间:2015-10-05 18:58:22

标签: c++ boost shared-ptr

在这个例子中,我从书中获取了#34;超越C ++标准库 - Boost" :

boost::shared_ptr<A> createA()
{
boost::shared_ptr<A> p(new B()); // B is a class
return p;
}
int main()
{
typedef std::vector<boost::shared_ptr<A> > container_type;
container.push_back(createA()); /* before returning p does the reference count reach 2 ? */
assert(container[0].use_count() == 1); // true
}

我想知道内部的参考计数器&#34; p&#34;当我们创建共享指针时,最多可以达到2:1;#34; p&#34; 2,在摧毁&#34; p&#34;返回(复制)其价值后......

我的问题的目标是当我们有一个返回shared_ptr的函数时知道哪个选项更好:返回一个shared_ptr对象或一个动态创建的shared_ptr的引用。测试完毕后:

boost::shared_ptr<A>& createA()
{
boost::shared_ptr<A> &p = *(new boost::shared_ptr<A>(new B));
assert(p.use_count() == 1);
return p;
}
/* ... */
boost::shared_ptr<A> & tmp_ref = createA();
assert(tmp_ref.use_count() == 1);
container.push_back(tmp_ref);
assert(container[0].use_count() == 2);

我可以说返回一个对象是更可取的,因为在另一种情况下,引用计数是2和那个逻辑(1因为我们创建了shared_ptr dynamiccaly而2是因为向量已经复制了它)。

2 个答案:

答案 0 :(得分:4)

是的,它可以达到2。

它可以达到更高而不是2,因为我们不知道vector实现可以在内部推送多少副本。允许复制任意次数。

答案 1 :(得分:2)

你的第二个例子有内存泄漏,所以你不要比较苹果和苹果。无论如何,增加计数器而不是在堆上创建另一个对象肯定更便宜。我不太明白为什么你这么关心参考计数器,如果它达到一定的价值就做出决定。你是否理解,如果计数器达到2,它就不会制作另一个对象副本&#39; A&#39;?

注意:对于C ++ 11,您的函数createA()应该返回std::unique_ptr,这比std::shared_ptr更有效,并且可以在必要时转换为共享。