2013-04-12 28 views
5

Giả sử tôi có một phương pháp như vậyCó thêm một tham chiếu đến một ptr chia sẻ tăng tính tham khảo

void foo(const boost::shared_ptr<Pfoo>& rx) 
{ 
    myvector->push_back(rx); 
} 

Tôi đọc thấy rằng khi một tăng :: shared_ptr được thông qua như là một tham chiếu đếm tham chiếu của nó không tăng. Bây giờ điều gì sẽ xảy ra trong kịch bản trên nếu ptr thực tế hết phạm vi?

Trả lời

5

Khi chuyển con trỏ theo tham chiếu - không có bản sao nào xảy ra, không có bộ đếm tham chiếu tăng lên.

myvector->push_back(rx); 

Ở đây, trong vector sẽ được đẩy bản sao của rx, không rx, vì vậy, tài liệu tham khảo cần toa sẽ được tăng lên.

2

Khi bạn chuyển qua tham chiếu, bạn chuyển cùng một con trỏ - không có bản sao nào xảy ra. Vì vậy, tuổi thọ của rx bị ràng buộc với tuổi thọ của đối tượng gốc. Khi bạn làm push_back vùng chứa sẽ sao chép rx và do đó tăng số lần tính lại.

0

số Dưới mã chỉ vượt qua con trỏ thông minh với chức năng và sẽ không tăng số lượng tài liệu tham khảo của nó:

void foo(const boost::shared_ptr<Pfoo>& rx) 

Ngoài ra, đẩy rx vào vector sẽ làm tăng số lượng tài liệu tham khảo:

myvector->push_back(rx); 
0

smart_ptr được chuyển thành tham chiếu, vì vậy nó sẽ không tính số lần tăng ref tại thời điểm đó. Trong trường hợp bản sao vector của đối tượng được chèn vào. Vì vậy, tham chiếu sẽ được tăng lên.

myvector->push_back(rx); //Copy of object is passed. 
+1

Ý của bạn là nếu bản sao được thực hiện tham chiếu sẽ được tăng lên –

+0

@ casper_2211 .yes – shivakumar

0

Đúng vậy. Nếu bạn chuyển một tham chiếu đến một con trỏ được chia sẻ, hàm chỉ nhận một tham chiếu (thường xuyên C++) đến tham chiếu (được chia sẻ) của người gọi. Nó không nhận được tham chiếu (được chia sẻ) của chính nó. Nếu tham chiếu của người gọi (được chia sẻ) bị hủy, mã sẽ thất bại.

Điều này đã xảy ra với tôi một lần và gây ra một lỗi nghiêm trọng rất khó để theo dõi và có hậu quả thực sự. Vì vậy, không chuyển tham chiếu đến các đối tượng trừ khi bạn chắc chắn không có chức năng nào có thể có tác dụng hủy bỏ đối tượng được tham chiếu!

push_back tạo tham chiếu mới cho đối tượng.

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