boost :: shared_ptr <t>和boost :: shared_ptr <const t =“”>是否共享引用计数?</const> </t>

时间:2010-09-30 07:04:41

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

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

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

1 个答案:

答案 0 :(得分:19)

非常安全。

以下代码示例:

#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,它们使用相同的指针,但使用不同的引用计数器。