删除作为 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
(为地图提供了一个比较仿函数)。
编辑
为了更精确:
- 我正在阅读 ADN 序列。对于我正在阅读的每个模式,我将其位置放在地图中。(std::map>)
- 我正在使用 char* 因为 std::string 分配的 char 数量超过所需数量
- 我的首要任务不是计算时间,而是 space 内存。
我希望这能帮助你理解我的问题。
您的代码已经可以运行(但不是异常安全的 - 智能指针应该是)。请注意,当内存为 delete
d 时,程序通常不会浪费时间更改它,它只会更改一些 free/in-use 记录,以便将来的分配可以考虑重用该内存,因此如果您尝试取消引用delete
d 指针你有未定义的行为,但它似乎仍然有旧内容 - 至少有一段时间。我想这就是您认为重新分配不起作用的原因....
您的地图有两个元素,您需要删除第一个元素:it->first
是 char*
,it->second
是 foo
。试试下面的代码:
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/
我想知道如何正确删除作为 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
(为地图提供了一个比较仿函数)。
编辑
为了更精确:
- 我正在阅读 ADN 序列。对于我正在阅读的每个模式,我将其位置放在地图中。(std::map>)
- 我正在使用 char* 因为 std::string 分配的 char 数量超过所需数量
- 我的首要任务不是计算时间,而是 space 内存。
我希望这能帮助你理解我的问题。
您的代码已经可以运行(但不是异常安全的 - 智能指针应该是)。请注意,当内存为 delete
d 时,程序通常不会浪费时间更改它,它只会更改一些 free/in-use 记录,以便将来的分配可以考虑重用该内存,因此如果您尝试取消引用delete
d 指针你有未定义的行为,但它似乎仍然有旧内容 - 至少有一段时间。我想这就是您认为重新分配不起作用的原因....
您的地图有两个元素,您需要删除第一个元素:it->first
是 char*
,it->second
是 foo
。试试下面的代码:
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/