关于boost::shared_ptr
的陷阱有几个有趣的问题。在其中一个中,有一个有用的提示可以避免将boost::shared_ptr<Base>
和boost::shared_ptr<Derived>
指向同一个Derived
类型的对象,因为它们使用不同的引用计数并可能过早地破坏对象。
我的问题:让boost::shared_ptr<T>
和boost::shared_ptr<const T>
同时指向T
类型的同一对象是否安全,或者这会导致同样的问题吗?
答案 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
,它们使用相同的指针,但使用不同的引用计数器。