gpt4 book ai didi

c++ - 为什么返回 map.insert().second 会引入无法访问的内存?

转载 作者:行者123 更新时间:2023-11-30 01:57:47 26 4
gpt4 key购买 nike

以下代码:

  ~A()
{
for (itr = mymap.begin(); itr != mymap.end() ++itr)
{
delete itr->second //the map look like this <std::string , T*>
}
}



A::Addnew(std::string name)
{
return mymap.insert(std::pair<std::string,T*>(name, new T)).second;
}

引入内存泄漏,但如果我将 AddNew() 成员函数更改为:

itr = mymap.find(name);
if(itr == mymap.end())
{
return mymap.insert(std::pair<std::string,T*>(name, new T)).second;
}

那么就没有内存泄漏了。

似乎如果我不小心调用了第一个案例,我会引入很多新的 T,但我的 mymap.size() 无法跟踪它。谁能解释一下?

最佳答案

std::map::insert() 如果键已经存在于映射中则为空操作。

如果您尝试插入重复的键,您的代码的第一个版本将泄漏它使用 new 分配的对象。

第二个版本没有这个问题,因为你不调用 new 除非你确定键不存在于 map 中。

修复泄漏的两种好方法是:

  • 按值存储对象;
  • 存储指向对象的智能指针。

关于c++ - 为什么返回 map.insert().second 会引入无法访问的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18247180/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com