2010-09-13 27 views
9

Xin lỗi nếu điều này được trả lời rõ ràng ở đâu đó, nhưng tôi hơi bối rối bởi tài liệu và bài viết tôi đã đọc trực tuyến.câu hỏi về chuyển nhượng với tăng :: shared_ptr (so với hàm reset())

tôi thấy rằng tôi có thể sử dụng các thiết lập lại() chức năng để giải phóng bộ nhớ trong vòng một shared_ptr (giả sử số lượng tài liệu tham khảo đi đến số không), ví dụ:

shared_ptr<int> x(new int(0)); 
x.reset(new int(1)); 

này, tôi tin rằng sẽ cho kết quả trong việc tạo ra của hai đối tượng số nguyên và ở cuối hai dòng này, số nguyên bằng 0 sẽ bị xóa khỏi bộ nhớ.

Nhưng, những gì nếu tôi sử dụng khối mã sau đây:

shared_ptr<int> x(new int(0)); 
x = shared_ptr<int>(new int(1)); 

Rõ ràng, bây giờ * x == 1 là đúng, nhưng sẽ đối tượng nguyên gốc (bằng không) bị xóa khỏi bộ nhớ hoặc có Tôi đã rò rỉ bộ nhớ đó? Có vẻ như với tôi rằng đây sẽ là vấn đề của toán tử gán giảm số tham chiếu của shared_ptr, nhưng nhìn lướt qua mã nguồn dường như không xóa câu hỏi cho tôi. Hy vọng rằng một người nào đó có kinh nghiệm hoặc hiểu biết hơn có thể giúp tôi. Cảm ơn trước.

Trả lời

15

Các tài liệu là khá rõ ràng:

shared_ptr & operator=(shared_ptr const & r); // never throws

Effects: Tương đương với shared_ptr(r).swap(*this).

Vì vậy, nó chỉ hoán đổi quyền sở hữu với đối tượng tạm thời bạn tạo. Tạm thời hết hạn, giảm số lượng tham chiếu. (Và deallocating nếu không.)


Mục đích của các thùng chứa này là không bị rò rỉ bộ nhớ. Vì vậy, không, bạn không cần phải lo lắng về việc rò rỉ mọi thứ trừ khi bạn đang cố gắng làm mọi thứ rối tung lên. (Nói cách khác, bạn có thể không cần nghi ngờ Boost biết họ đang làm gì.)

+0

Tôi đã thấy điều này, nhưng sau đó tôi cũng thấy thông tin bổ sung có thể xung đột. Cảm ơn bạn đã kiểm tra sự tỉnh táo. – RandomGuy

5

Bạn chưa bị rò rỉ bộ nhớ. Bộ nhớ cho đối tượng int đầu tiên sẽ bị xóa.

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