Nó hoàn toàn an toàn.
Mẫu mã sau:
#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;
}
biên dịch và chạy tốt, và là hoàn toàn chính xác. Kết quả đầu ra:
a: 2
b: 2
Hai số shared_ptr
có cùng bộ đếm tham chiếu.
Ngoài ra:
#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;
}
cư xử theo cùng một cách. Bạn phải, tuy nhiên không bao giờ xây dựng shared_ptr
của bạn sử dụng một cấu trúc như thế này:
boost::shared_ptr<A> a(new B());
boost::shared_ptr<B> b(static_cast<B*>(a.get()));
a.get()
cho con trỏ thô và mất tất cả thông tin về tính tham khảo. Làm điều này, bạn sẽ kết thúc với hai khác biệt (không liên kết) shared_ptr
mà sử dụng cùng một con trỏ nhưng quầy tham chiếu khác nhau.
Bạn có thể cung cấp tham chiếu cho xác nhận quyền sở hữu/gốc không? – fredoverflow
http://stackoverflow.com/questions/701456/what-are-potential-dangers-when-using-boostshared-ptr/716112#716112 – lytenyn
Cơ sở/Nguồn gốc an toàn 100%. Không an toàn khi sử dụng 'get()'. Đây là tình huống tương tự mà không có Base: 'shared_ptr ptr (new Derived), ptr2 (ptr.get());' - không an toàn. –
ybungalobill