shared_ptr 和参考计数器

shared_ptr and reference counter

在这个例子中,我取自书 "Beyond the C++ Standard Library - An introduction to 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
}

我想知道"p"里面的引用计数器在我们创建共享指针"p"时是否可以达到最大值2:1,在返回后销毁"p"之前是2(复制)它的价值...

我的问题的目的是知道当我们有一个 returns a 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 dynamically 和 2 因为向量复制了它)。

是的,可以达到2。

它可能会达到比 2 更高,因为我们不知道 vector 实施在推迟时可能在内部制作多少副本。可以复制任意多次。

您的第二个示例存在内存泄漏,因此您没有将苹果与苹果进行比较。无论如何,增加计数器肯定比在堆上创建另一个对象更便宜。我不太明白为什么您如此关心参考计数器并在达到一定值时做出决定。你知道如果计数器达到 2 它不会再复制对象 'A'?

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