2010-09-30 37 views
11

Có một số câu hỏi thú vị về những cạm bẫy với boost::shared_ptr s. Trong một trong số đó, có một mẹo hữu ích để tránh chỉ boost::shared_ptr<Base>boost::shared_ptr<Derived> cho cùng một đối tượng thuộc loại Derived vì chúng sử dụng các số tham chiếu khác nhau và có thể phá hủy đối tượng sớm.Tăng tốc :: shared_ptr <T> và tăng :: shared_ptr <const T> chia sẻ số lượng tham chiếu?

Câu hỏi của tôi: Có an toàn để có cả hai boost::shared_ptr<T>boost::shared_ptr<const T> trỏ đến cùng một đối tượng thuộc loại T hoặc điều này có gây ra cùng sự cố không?

+1

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

+0

http://stackoverflow.com/questions/701456/what-are-potential-dangers-when-using-boostshared-ptr/716112#716112 – lytenyn

+5

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

Trả lời

18

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.

+0

Cảm ơn, bạn hoàn toàn đúng. Tôi đã có một sự hiểu lầm hoàn toàn khác nhau dọc theo dòng ví dụ của ybungalobill. Cảm ơn cả hai người! – lytenyn

+1

Tôi sắp đăng câu hỏi về việc truyền shared_pointer nhưng nhận câu trả lời ở đây. Cám ơn. – rjoshi

Các vấn đề liên quan