2012-02-05 30 views
7

Khi sử dụng shared_ptr, tôi có nên sử dụng khai báo shared_ptr một lần hoặc khai báo shared_ptr ở mọi nơi tôi chuyển không?Khi sử dụng shared_ptr nên tôi chỉ sử dụng khai báo shared_ptr một lần hoặc khai báo shared_ptr ở mọi nơi tôi vượt qua nó?

Vì vậy, trong các chức năng mà tôi mới lên trường hợp tôi bọc nó trong một shared_ptr nhưng khi tôi quay trở lại nó từ chức năng tôi cũng có thể trả về một shared_ptr đó hoặc sử dụng get() trên shared_ptr, chỉ cần trả về một con trỏ bình thường.

Vì vậy, câu hỏi của tôi là, tôi chỉ nên sử dụng shared_ptr<myType> khi tôi mới dụ và sau đó vượt qua con trỏ bình thường xung quanh hoặc tôi nên đi qua shared_ptr<myType> ở khắp mọi nơi?

Trả lời

5

Tạo shared_ptr không hấp thụ sức mạnh ma thuật trên đối tượng pointee của nó. Phép thuật là tất cả trong số shared_ptr — và bản sao của nó là —. Nếu bạn ngừng sử dụng nó, bạn sẽ mất số tham chiếu của mình; tệ hơn, bởi vì bạn đã sử dụng nó tại một số điểm, đối tượng sẽ tự động bị xóa khi bạn không mong đợi nó.

toàn bộ điểmshared_ptr là bạn biết đối tượng của mình sẽ không bị tiêu diệt khi bạn vẫn đang sử dụng nó ở đâu đó.

Trong điều sau đây:

T* foo() { 
    shared_ptr<T> sp(new T()); 
    return sp.get(); 
    //^the only shared_ptr<T> referencing the obj is dead; 
    // obj is deleted; 
    // returned pointer invalid before you can even do anything with it 
} 

con trỏ của bạn là ngay lập tức không hợp lệ.

Cũng có thể có trường hợp bạn trích xuất một con trỏ thô, nhưng những trường hợp này hiếm khi xảy ra. Nếu bạn đang ở trong một chức năng mà bạn biết bạn không cần tính tham chiếu, sau đó chỉ cần chuyển số shared_ptr bằng tham chiếu.

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