【问题标题】:Do boost::shared_ptr<T> and boost::shared_ptr<const T> share the reference count?boost::shared_ptr<T> 和 boost::shared_ptr<const T> 共享引用计数吗?
【发布时间】:2010-09-30 07:04:41
【问题描述】:

关于boost::shared_ptrs 的陷阱有几个有趣的问题。其中一个有用的提示是避免将boost::shared_ptr&lt;Base&gt;boost::shared_ptr&lt;Derived&gt; 指向Derived 类型的同一对象,因为它们使用不同的引用计数并可能过早地破坏对象。

我的问题:让boost::shared_ptr&lt;T&gt;boost::shared_ptr&lt;const T&gt; 指向同一个T 类型的对象是否安全,或者这会导致同样的问题吗?

【问题讨论】:

  • 您能否为 Base/Derived 声明提供参考?
  • 基础/派生是 100% 安全的。使用get() 是不安全的。这是没有 Base 的类似情况:shared_ptr&lt;Derived&gt; ptr(new Derived), ptr2(ptr.get()); -- unsafe.
  • @ybungalobill:谢谢,这是我一直认为安全的示例。你澄清了我对 boost::shared_ptr 工作原理的严重误解..

标签: c++ boost shared-ptr smart-pointers


【解决方案1】:

绝对安全。

以下代码示例:

#include <iostream>
#include <boost/shared_ptr.hpp>

int main(int, char**)
{
  boost::shared_ptr<int> a(new int(5));
  boost::shared_ptr<const int> b = a;

  std::cout << "a: " << a.use_count() << std::endl;
  std::cout << "b: " << b.use_count() << std::endl;

  return EXIT_SUCCESS;
}

编译运行良好,完全正确。它输出:

a: 2
b: 2

两个shared_ptr 共享同一个引用计数器。


还有:

#include <iostream>
#include <boost/shared_ptr.hpp>

class A {};
class B : public A {};

int main(int, char**)
{
    boost::shared_ptr<A> a(new B());
    boost::shared_ptr<B> b = boost::static_pointer_cast<B>(a);

    std::cout << "a: " << a.use_count() << std::endl;
    std::cout << "b: " << b.use_count() << std::endl;

    return EXIT_SUCCESS;
}

以同样的方式行事。但是,您必须从不使用如下构造构建您的 shared_ptr

boost::shared_ptr<A> a(new B());
boost::shared_ptr<B> b(static_cast<B*>(a.get()));

a.get() 提供原始指针并丢失有关引用计数的所有信息。这样做,您最终会得到两个不同的(未链接的)shared_ptr,它们使用相同的指针但不同的引用计数器。

【讨论】:

  • 谢谢,您说的完全正确。我对 ybungalobill 的例子有完全不同的误解。谢谢你们!
  • 我正要发布一个关于投射 shared_pointer 的问题,但在这里得到了答案。谢谢。
猜你喜欢
  • 1970-01-01
  • 2018-02-19
  • 1970-01-01
  • 2017-10-22
  • 1970-01-01
  • 2010-11-27
  • 2018-05-13
  • 2013-07-21
  • 1970-01-01
相关资源
最近更新 更多