假设我有一些unordered_map
指向类实例的指针,是否会从该地图中删除一个对象并删除该实例?
(重写问题:)如果我想删除该实例,哪个版本是正确的?
if(it != map.end())
{
delete it->second;
map.erase(it);
}
或只是
if(it != map.end())
map.erase(it);
更新:正如许多人所建议的那样,我开始使用shared_ptr
,而且效果很好!
答案 0 :(得分:17)
不,因为这是标记为C ++ 11,所以您应该首先使用std::unique_ptr
/ std::shared_ptr
来管理对象指针,例如。
std::unordered_map<std::string, std::unique_ptr<myClass>>
即使你在调用delete
之前虔诚地确保你的指针是erase
d,你仍然需要考虑在发生异常时会发生什么,或者如果你分配其他东西相同的钥匙,或任何可能泄漏的其他可能性。除非你有充分的理由使用new
和delete
,否则不要;坚持std::unique_ptr
/ std::shared_ptr
和std::make_unique
/ std::make_shared
,它更安全,让您的代码更易于阅读。