从地图中删除条目显示Valgrind中的泄漏

时间:2016-08-04 06:54:23

标签: c++ dictionary valgrind delete-operator

#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <map>
using namespace std;

char a[10];
map <string, char*> mm;

void update(string s, char* b)
{
    delete mm[s];
    mm[s] = b;
}
int main()
{ 
    char* ptr = new char[100];
    char* ptr1 = new char[100];
    mm.insert(pair<string, char*>(string("abc"), ptr));
    update ("abc", ptr1);  

    delete ptr1;
    return 0; 
 } 

我的代码有点像这样。当我尝试使用键删除值时,Valgrind显示泄漏。

 delete mymap[key];

但是我尝试了上面的代码同样Valgrind显示没有泄漏。在这样的地图中使用删除是否有任何不利之处?我分配了一个迭代器并尝试使用

删除它
delete itr->second;

它工作正常。没有泄漏。第一种删除方式有什么问题?

1 个答案:

答案 0 :(得分:1)

您的代码存在以下问题:

  1. 明确选择使用时char* std::string
  2. 使用std::map时,使用operator[]总是很棘手 在delete mm[s];中进行,如果key = s不存在那么你就是 什么都不删除
  3. 因为您要使用new[]创建数组,所以必须使用 delete[]。否则它是未定义的行为。
  4. 最后delete ptr1是危险的,因为如果使用mm 然后,你正在访问一个悬空指针。
  5. 要回答你的问题,我不确定为什么Valgrind会显示内存泄漏,因为从技术上讲,你处于“未定义的行为”。

    我建议使用:

    map <string, string> mm;
    

    map <string, std::unique_ptr<char[]>> mm;