std :: unordered_map <std :: string,myclass * =“”> - std :: unordered_map :: erase()调用myClass'DTor?</std :: string,>

时间:2014-10-21 08:01:26

标签: c++ c++11

假设我有一些unordered_map指向类实例的指针,是否会从该地图中删除一个对象并删除该实例?

(重写问题:)如果我想删除该实例,哪个版本是正确的?

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

或只是

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

更新:正如许多人所建议的那样,我开始使用shared_ptr,而且效果很好!

1 个答案:

答案 0 :(得分:17)

不,因为这是标记为C ++ 11,所以您应该首先使用std::unique_ptr / std::shared_ptr来管理对象指针,例如。

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

即使你在调用delete之前虔诚地确保你的指针是erase d,你仍然需要考虑在发生异常时会发生什么,或者如果你分配其他东西相同的钥匙,或任何可能泄漏的其他可能性。除非你有充分的理由使用newdelete,否则不要;坚持std::unique_ptr / std::shared_ptrstd::make_unique / std::make_shared,它更安全,让您的代码更易于阅读。