std :: unordered_map <std :: String,myClass*> - std :: unordered_map :: erase()调用myClass'DTor?

St0*_*0fF 8 c++ c++11

假设我有一些unordered_map指向类实例的指针,从该映射中删除一个对象也会删除该实例?

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

if(it != map.end())
{
    delete it->second;
    map.erase(it);
}
Run Code Online (Sandbox Code Playgroud)

或者干脆

if(it != map.end())
    map.erase(it);
Run Code Online (Sandbox Code Playgroud)

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

use*_*267 17

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

std::unordered_map<std::string, std::unique_ptr<myClass>>
Run Code Online (Sandbox Code Playgroud)

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

  • +1.**并且**即使你有充分的理由使用`new`和`delete`,再考虑一下,看看这个原因是否真的足以保证所有的风险和原始内存管理带来的麻烦. (3认同)