std::unordered_map<std::String, myClass*> - erase()函数是否会调用myClass的析构函数?

8
假设我有一些指向类实例的无序映射unordered_map指针,那么从该映射中擦除一个对象是否也会删除该实例?
(重新表述问题:)如果我想删除该实例,哪个版本是正确的?
if(it != map.end())
{
    delete it->second;
    map.erase(it);
}

或者简单地说
if(it != map.end())
    map.erase(it);

更新:正如许多人建议的那样,我转而使用shared_ptr,它非常好用!


4
单独使用"erase"会泄漏指针。考虑使用一个"unique_ptr"的映射表。 - T.C.
如果需要拥有指针的所有权,为什么不使用unique_ptr呢?它会自动删除对象。 - MicroVirus
谢谢。该地图仅为按名称查找,我应用程序的其余部分需要使用指针,因此我会采取其他预防措施以避免使用释放的指针。 - St0fF
您还可以使用std::shared_ptr,或者您可以将实际对象存储在映射内:std::unordered_map<std::string, myClass> - bames53
@bames53:感谢你的提示,但我想补充一点:直接将类实例存储在映射中可能会遇到麻烦。虽然这样做完全没问题,但它取决于您的实际程序以及它所要做的事情。在我的情况下,这不是一个选项。 - St0fF
1个回答

17

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

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

即使您在任何调用erase之前都会非常注意确保您的指针已经被deleted,但仍然需要考虑在发生异常、将其他内容分配给相同的键或任何可能泄漏的情况下会发生什么。除非您有非常好的理由使用newdelete,否则不要使用它们;请使用std::unique_ptr / std::shared_ptrstd::make_unique / std::make_shared,这样更安全,并且使您的代码更易于阅读。


3
即使您有非常充分的理由使用newdelete,请再仔细考虑一下,看看这个理由是否足以证明原始内存管理所带来的所有风险和麻烦。 - Angew is no longer proud of SO
谢谢,我会考虑并最终去做。 - St0fF

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接