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

时间:2015-04-17 14:13:39

标签: c++ pointers c++11 stl stdmap

我想知道如何正确删除指针std::map的第一个键。我只能想出第二把钥匙。第一个键只能读取。

示例:

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

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

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

修改

更精确:

  • 我正在阅读ADN序列。对于我正在阅读的每个模式,我将其位置放在地图中。(std :: map&gt;)
  • 我使用char *因为std :: string分配的所需数量超过了char
  • 我的优先事项不是计算时间,而是记忆中的空间。

我希望这可以帮助您理解我的问题。

3 个答案:

答案 0 :(得分:1)

您的代码已经可以使用(但不是例外安全 - 智能指针就是这样)。请注意,当内存为delete d时,程序通常不会浪费时间更改它,它只是更改一些免费/使用中的记录,以便将来的分配可以考虑将内存重用,所以如果你尝试取消引用delete d指针你有未定义的行为,但它似乎仍然有旧的内容 - 至少有一段时间。我认为这就是为什么你认为解除分配不起作用......

答案 1 :(得分:0)

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

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

希望有所帮助!

答案 2 :(得分:0)

解决

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

再次感谢您的回答!

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