Điều này sẽ xóa con trỏ có trong bản đồ [...]?
Không, với mã bạn đã cung cấp, bạn sẽ làm rò rỉ mọi thành viên của bản đồ.
Theo quy tắc, đối với mỗi new
, phải có một số delete
phù hợp. Bạn có một delete
cho bản đồ, nhưng không có gì cho các phần tử bên trong.
Giải pháp chính xác nhất cho vấn đề này là không sử dụng phân bổ động. Chỉ cần lưu thư mục MyType
s, nếu có thể:
map<string, MyType>
... và thay vì tự động phân bổ các map
bản thân, lưu trữ tự động:
map<string,MyType> my_map;
Nếu thời gian lưu trữ tự động là không thể đối với một số lý do, sau đó sử dụng một con trỏ thông minh cho phân bổ động. Với một trình biên dịch C++ 11, sử dụng unique_ptr
(hoặc hiếm gặp hơn, hoặc thậm chí shared_ptr
weak_ptr
) cho các yếu tố trong map
:
map<string, unique_ptr<MyType>> my_map;
(Với một trình biên dịch C++ 03, sử dụng các khoản tương đương Boost đó.) Sau đó, khi my_map
bị hủy, tất cả các thành phần sẽ là delete
d.
Baring tất cả điều này, nếu bạn đang ở trong một tình huống mà không có ở trên sẽ làm việc cho bạn (tôi sẽ bởi rất nghi ngờ), sau đó bạn sẽ cần phải lặp bản đồ khỏang:
struct deleter
{
template <typename T> operator() (const T& rhs) const
{
delete rhs.second;
}
};
for_each (my_map->begin(), my_map->end(), deleter());
Trong C++ 11, điều này có thể được thực hiện một lambda, một cái gì đó dọc theo dòng:
for_each (my_map->begin(), my_map->end(), [](auto item) -> void
{
delete item.second;
});
Sau đó - các thùng chứa 'bản đồ' (và hầu hết (nếu không phải tất cả?) Trong thư viện chuẩn) chưa được thiết kế để xóa bất kỳ con trỏ nào nó chứa khi hủy. – Nbr44
Ok cảm ơn. Tài liệu tôi đọc trên đó không rõ ràng lắm. Nó đọc: 'Điều này làm giảm kích thước vùng chứa một cách hiệu quả bởi số lượng các phần tử bị loại bỏ, bị phá hủy.' – Max
Đó là một sự hiểu lầm phổ biến - bản thân _pointers_ thực sự bị phá hủy, nhưng điều đó không thay đổi trạng thái của vị trí bộ nhớ mà chúng trỏ đến . – Nbr44