2008-09-26 36 views
6

Giả sử tôi có một foo lớp, và muốn sử dụng một std :: bản đồ để lưu trữ một số boost :: shared_ptrs, ví dụ:tăng :: shared_ptr container tiêu chuẩn

class foo; 

typedef boost::shared_ptr<foo> foo_sp; 
typeded std::map<int, foo_sp> foo_sp_map; 

foo_sp_map m; 

Nếu tôi thêm một foo_sp mới đến bản đồ nhưng khóa đã sử dụng đã tồn tại, mục nhập hiện có có bị xóa không? Ví dụ:

foo_sp_map m; 

void func1() 
{ 
    foo_sp p(new foo); 
    m[0] = p; 
} 

void func2() 
{ 
    foo_sp p2(new foo); 
    m[0] = p2; 
} 

Con trỏ ban đầu (p) được giải phóng khi nó được thay thế bằng p2? Tôi khá chắc chắn nó sẽ được, nhưng tôi nghĩ rằng nó là giá trị yêu cầu/chia sẻ.

+0

Câu hỏi đã sửa đổi - nên được chia sẻ_ptr không auto_ptr, – Rob

+0

Đó là "nên _have_" –

Trả lời

7

Trước hết, tiêu đề câu hỏi của bạn nói đẩy mạnh :: auto_ptr, nhưng bạn thực sự có nghĩa là đẩy mạnh :: shared_ptr

Và vâng, con trỏ gốc sẽ được trả tự do (nếu có được chia sẻ không có thêm tài liệu tham khảo để nó).

0

Vì lưu lượng truy cập ngăn xếp sẽ không cho phép tôi nhận xét, tôi sẽ chỉ trả lời. :/

Tôi không thấy "p" nằm ngoài phạm vi, vì vậy đối tượng được trỏ tới bởi nó sẽ không được giải phóng. "p" sẽ vẫn trỏ đến nó.

+0

Tôi nên làm rõ rằng p sẽ nằm ngoài phạm vi thời gian p2 được tạo. – Rob

+0

Hạn chế về nhận xét của người dùng mới là ngăn người dùng mới nhận xét, không khuyến khích bạn phá vỡ hệ thống! –

1

Nó phụ thuộc vào những gì xảy ra trong bạn ... phần

lớp container của bạn có chứa bản của trường hợp của foo_sp, khi bạn thực hiện m[0] = p2; các bản sao của p đó là ban đầu ở nơi đó đi ra khỏi phạm vi. Tại thời điểm đó, nó sẽ bị xóa nếu không có foo_sp nào khác đề cập đến nó.

Nếu bản sao được khai báo ở dòng thứ hai foo_sp p(new foo); vẫn còn xung quanh thì bộ nhớ sẽ không được giải phóng. Mục nhập sẽ bị xóa sau khi tất cả các tham chiếu đến nó đã bị xóa.

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