gpt4 book ai didi

c++ - 重复键时删除 STL hash_map 上的键/值时遇到问题

转载 作者:行者123 更新时间:2023-11-30 04:40:33 25 4
gpt4 key购买 nike

我正在使用 C++ hash_map 来存储一些 C 风格的字符串对。在这种情况下,所有键都应该是唯一的……

我的问题是在多次运行压力测试时出现严重的内存泄漏。

当测试中的这些键都不相同时,就没有内存泄漏。但是使用相同的键是不同的故事...

hash_map(这是 Google 的 sparsehash 但它完全实现了 SGI 功能)

sparse_hash_map<const char*, char *, hash<const char*>, eqstr> values;

我搜索过但找不到一个函数来替换具有相同键的键/值对。

values[k]=v;

只会添加一对新的,即使 key 是相同的。 (我认为应该可以切换的行为)——这不过是一个 hash_map.insert()

所以我有一个函数来检查 key 是否存在,如果它确实替换了 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);  

它在第一个重复键上崩溃。

我尝试过 2 种方法。选项 1 导致删除时出现段错误(这也让我感到困惑)。选项 2 只是没有解决问题,仍然存在内存泄漏。也许我只是做错了。

是的,我知道我可以使用 C++ 字符串,但我不想这样做。试图为嵌入式系统保持这种真实的光。感谢任何帮助...

最佳答案

您可以通过迭代器直接在 hash_map 中更改值:

    ret = it->second;

it->second = v; // end option 2
}

这将是更快、更安全的解决方案。

您还可以尝试另一种 hash_map 方法来按键删除,而不是迭代器删除:

size_type erase(const key_type& k)

关于c++ - 重复键时删除 STL hash_map 上的键/值时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1150649/

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