#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;
它工作正常。没有泄漏。第一种删除方式有什么问题?
答案 0 :(得分:1)
您的代码存在以下问题:
char*
std::string
std::map
时,使用operator[]
总是很棘手
在delete mm[s];
中进行,如果key = s
不存在那么你就是
什么都不删除new[]
创建数组,所以必须使用
delete[]
。否则它是未定义的行为。delete ptr1
是危险的,因为如果使用mm
然后,你正在访问一个悬空指针。要回答你的问题,我不确定为什么Valgrind会显示内存泄漏,因为从技术上讲,你处于“未定义的行为”。
我建议使用:
map <string, string> mm;
或
map <string, std::unique_ptr<char[]>> mm;