繁体   English   中英

做boost :: shared_ptr <T> 和boost :: shared_ptr <const T> 分享参考计数?

[英]Do boost::shared_ptr<T> and boost::shared_ptr<const T> share the reference count?

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

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

这是非常安全的。

以下代码示例:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM