這是完全安全的。
下面的代碼示例:
#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
,它們使用相同的指針但是不同的引用計數器。
您能否提供基準/衍生聲明的參考? – fredoverflow 2010-09-30 07:07:09
http://stackoverflow.com/questions/701456/what-are-potential-dangers-when-using-boostshared-ptr/716112#716112 – lytenyn 2010-09-30 07:11:51
基地/派生是100%安全。使用'get()'是不安全的。這裏是沒有Base的類似情況:''shared_ptr ptr(new Derived),ptr2(ptr.get());' - unsafe。 –
ybungalobill
2010-09-30 07:16:35