2014-10-21 22 views
8

Giả sử tôi có một số số unordered_map con trỏ tới các phiên bản lớp học, việc xóa một đối tượng khỏi bản đồ đó cũng có xóa đối tượng không?std :: unordered_map <std :: String, myClass *> - không std :: unordered_map :: erase() gọi myClass 'DTor?

(viết lại câu hỏi :) Nếu tôi muốn xóa phiên bản đó, phiên bản nào sẽ đúng?

if(it != map.end()) 
{ 
    delete it->second; 
    map.erase(it); 
} 

hoặc đơn giản là

if(it != map.end()) 
    map.erase(it); 

?

CẬP NHẬT: như được đề xuất bởi nhiều người, tôi đã chuyển sang sử dụng shared_ptr và hoạt động tuyệt vời!

+4

'xóa 'tự nó sẽ làm rò rỉ con trỏ. Xem xét sử dụng bản đồ 'unique_ptr's. –

+0

Nếu nó cần sở hữu các con trỏ, tại sao không sử dụng 'unique_ptr', điều này sẽ xóa đối tượng cho bạn? – MicroVirus

+0

Cảm ơn bạn. Bản đồ chỉ là một tra cứu theo tên, phần còn lại của ứng dụng của tôi cần phải sử dụng các con trỏ, vì vậy tôi có biện pháp phòng ngừa khác để không sử dụng một con trỏ giải phóng. – St0fF

Trả lời

17

Không, và vì thẻ này được gắn thẻ C++ 11, bạn nên sử dụng std::unique_ptr/std::shared_ptr để quản lý con trỏ đối tượng của bạn ngay từ đầu, ví dụ:

std::unordered_map<std::string, std::unique_ptr<myClass>> 

Thậm chí nếu bạn tôn giáo chắc chắn rằng con trỏ của bạn là delete d trước bất kỳ cuộc gọi đến erase, bạn vẫn phải xem xét những gì sẽ xảy ra trong trường hợp có một ngoại lệ, hoặc nếu bạn gán một cái gì đó khác để cùng khóa hoặc bất kỳ khả năng nào khác có thể bị rò rỉ. Trừ khi bạn có một lý do rất tốt để sử dụng newdelete, đừng; dính vào std::unique_ptr/std::shared_ptrstd::make_unique/std::make_shared, an toàn hơn và giúp mã của bạn dễ đọc hơn.

+3

+1. ** Và ** ngay cả khi bạn có một lý do rất tốt để sử dụng 'new' và' delete', hãy suy nghĩ về nó một số chi tiết và xem lý do đó có thực sự đủ tốt để đảm bảo mọi rủi ro và quản lý bộ nhớ thô phức tạp mang lại hay không. – Angew

+0

Cảm ơn bạn, tôi sẽ suy nghĩ về nó và cuối cùng làm điều đó. – St0fF

+0

@Angew: vui lòng xem cập nhật cho câu hỏi. Cảm ơn rất nhiều! – St0fF

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