1

以下代码:

  ~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()无法跟踪它。谁能解释一下?

4

2 回答 2

4

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

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

第二个版本没有这个问题,因为new除非您确定地图中不存在密钥,否则您不会调用。

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

  • 按值存储对象;
  • 存储指向对象的智能指针。
于 2013-08-15T06:15:39.137 回答
0

在您的第一个 AddNew 函数中:当您插入其键已存在于地图中的成员时,您将创建一个 T 对象,但您不释放它:

你可以这样做:

A::Addnew(std::string name)
    {
       T *temp = new T;
       if(mymap.insert(std::pair<std::string,T*>(name, temp)).second)
           return true;
       else
        {
           delete temp;
           return false;
         }
    }
于 2013-08-15T06:23:19.190 回答