删除作为 std::map 第一个键的指针

Delete a pointer as first key of std::map

我想知道如何正确删除作为 std::map 的第一个键的指针。我只能为第二个键弄清楚这一点。第一个键只能读取。

示例:

std::map<char*,foo> myMap;
char* str = new char[3];
foo bar;
str[0]='h';
str[1]='i';
str[2]='[=11=]';
myMap[str] = bar

/* some code */
for(auto element: myMap)
{
    delete [] element.first;
}

这似乎没有释放指针。 std::map 指针丢失了吗? 我正在处理大数据,所以我需要尽可能轻的字符串结构。这就是为什么我使用 char* 而不是 std::string (为地图提供了一个比较仿函数)。

编辑

为了更精确:

我希望这能帮助你理解我的问题。

您的代码已经可以运行(但不是异常安全的 - 智能指针应该是)。请注意,当内存为 deleted 时,程序通常不会浪费时间更改它,它只会更改一些 free/in-use 记录,以便将来的分配可以考虑重用该内存,因此如果您尝试取消引用deleted 指针你有未定义的行为,但它似乎仍然有旧内容 - 至少有一段时间。我想这就是您认为重新分配不起作用的原因....

您的地图有两个元素,您需要删除第一个元素:it->firstchar*it->secondfoo。试试下面的代码:

for(std::map<char*, foo>::iterator it = myMap.begin(); it!=myMap.end(); it++)
{
     delete[] it->first;
     myMap.erase(it);
}

希望对您有所帮助!

已解决

谢谢大家,您的大量评论有助于解决我的问题。我成功使用 std::string。我知道,我告诉过你它太重了。但是我找到了 reserve(size_t n=0) 方法,它正好允许我们想要的位置。现在,再也没有泄漏了。

再次感谢您的回答!

来源: http://www.cplusplus.com/reference/string/string/reserve/