我正在使用 C++ hash_map 来存储一些 C 风格的字符串对。对于这种情况,所有键都应该是唯一的......
在多次运行压力测试时,我的问题是严重的内存泄漏。
当测试中的这些键都不相同时,就没有内存泄漏。但是对于相同的键,它是一个不同的故事......
hash_map(这是 Google 的sparsehash,但它完全实现了 SGI 函数)
sparse_hash_map<const char*, char *, hash<const char*>, eqstr> values;
我搜索并找不到替换具有相同键的键/值对的函数。
values[k]=v;
即使密钥相同,也只会添加一个新对。(我认为应该是可切换的行为) - 这不过是 hash_map.insert()
所以我有一个函数来检查密钥是否存在,如果它确实替换了 val,如果不只是添加一个新对:
char *confFile::replaceOrStoreVal( char *k, char *v ) {
char *ret = NULL;
values.set_deleted_key(_DIST_KEY);
sparse_hash_map<const char*, char *, hash<const char*>, eqstr>::iterator it =
values.find(k);
if(it == values.end())
values[k] = v;
else {
// ret = it->second; // option 1
//it->second = v; // end option 1
//option 2
char *t = (char *) it->first;
ret = it->second;
values.erase( iter ); <--- seg fault here
free(t);
values[k] = v; // end option 2
}
return ret;
} ... and ret is later free()ed
最初对是这样添加的:
old = replaceOrStoreVal(recordname, value);
它在第一个重复键上崩溃。
我试过两种方法。选项 1 导致擦除时出现段错误(这也让我感到困惑)。选项 2 只是不能解决问题,仍然存在内存泄漏。也许我只是做错了。
是的,我知道我可以使用 C++ 字符串,但我不想这样做。对于嵌入式系统,试图保持这种真实的光线。任何帮助表示赞赏...