【发布时间】:2014-11-09 20:54:12
【问题描述】:
最近我发现了这种由erase 方法引起的unordered_set 的奇怪行为。我在下面展示了一个最小的例子。
首先我创建一个 unordered_set。然后我删除其中一个元素,比如法国。然后我用 for 循环擦除每个元素。在执行时,它会出现段错误。但是,如果我注释掉删除法国部分,那么代码就可以正常工作。
这个程序是用g++ test.cpp --std=c++11 编译的。 g++的版本是4.9.1。
#include <iostream>
#include <string>
#include <unordered_set>
int main ()
{
std::unordered_set<std::string> myset =
{"USA","Canada","France","UK","Japan","Germany","Italy"};
// erasing by key, causing segfault later; no segfault if commented out
myset.erase ( "France" );
std::cout << "myset contains:";
for ( const std::string& x: myset ) { myset.erase(x); }
// The problem persists for a regular for loop as well.
//for ( std::unordered_set<std::string>::iterator it = myset.begin(); it!=myset.end(); it++ ) { myset.erase(it); }
std::cout << std::endl;
return 0;
}
有人知道吗?
谢谢, KC
【问题讨论】:
标签: c++ segmentation-fault unordered-set