【问题标题】:shared_ptr and reference countershared_ptr 和引用计数器
【发布时间】:2016-01-02 12:55:55
【问题描述】:

在这个例子中,我取自《超越 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
}

我想知道“p”内部的引用计数器是否可以达到最大值 2:1 当我们创建共享指针“p”和 2 在返回(复制)其值后销毁“p”之前...

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

【问题讨论】:

  • 复制省略让人难以预测。它可能会也可能不会。

标签: c++ boost shared-ptr


【解决方案1】:

是的,它可以达到 2。

它可能会达到高于 2,因为我们不知道vector 实现会在内部生成多少副本,因为它正在推回。它可以复制任意多次。

【解决方案2】:

您的第二个示例存在内存泄漏,因此您无需将苹果与苹果进行比较。无论如何,增加计数器肯定比在堆上创建另一个对象更便宜。我不太明白为什么您如此关心引用计数器并根据它是否达到某个值来做出决定。你明白如果计数器达到 2 它不会复制对象 'A' 的另一个副本吗?

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-11
  • 1970-01-01
  • 2012-10-31
  • 2017-10-22
  • 1970-01-01
  • 2023-03-29
相关资源
最近更新 更多