【发布时间】:2017-03-15 19:54:20
【问题描述】:
我有一个作为map 的全局变量和一个迭代此map 元素的函数,例如:
void printMap(){
for ( auto it = MyMap.begin(); it != MyMap.end(); ++it ){
std::cout << it->second;
}
}
效果很好。
我想为打印元素后的函数添加一个功能,它应该从map 中删除,如下所示:
void printMap(){
for ( auto it = MyMap.begin(); it != MyMap.end(); ++it ){
std::cout << it->second;
MyMap.erase(it);
}
}
但是,通过添加擦除行,我得到了这种类型的异常错误:
线程 2:EXC_BAD_ACCESS(代码=1,地址=0x20000002)
我尝试了另一种方法,如下所示:
void myFunction(){
printMap();
MyMap.clear();
}
但我也遇到了同样的异常
线程 2:EXC_BAD_ACCESS(代码=1,地址=0x0)
据我了解,当我们引用不存在的内存位置时会发生这种异常。但我知道它就在那里,因为迭代器得到了它的值并被打印出来了。即便如此,我还是使用了第二种方法,以防万一我没有引用不存在的内存位置,但我仍然遇到了异常。
那么我怎样才能遍历元素打印结果然后删除它呢?
更新1
按照下面的建议和链接的主题,我将我的功能更改为:
void printMap(){
bool i = true;
for (auto it = MyMap.cbegin(), next_it = MyMap.cbegin(); it != MyMap.cend(); it = next_it)
{
cout << it->second;
next_it = it; ++next_it;
if (i) {
MyMap.erase(it);
}
}
}
我也试过这个https://stackoverflow.com/a/42820005/7631183 和这个https://stackoverflow.com/a/42819986/7631183
问题仍然没有解决,我得到同样的错误
UPDATE2
我在另一台机器上运行相同的确切代码,它运行良好。我仍然不知道是什么原因,所以我猜想正如 cmets 中所建议的那样,std::map 第一个有一些问题。
附:第一台机器是mac,第二台是Linux
【问题讨论】:
-
我认为问题有点不同,我遇到了一个异常,因为它引用了一个现有的内存位置,就好像它不存在一样
-
它不存在,因为你刚刚释放了它,所以你不能访问它。 @em2er 的副本比我的要好一点 :)
-
您的
map中包含哪些类型?你确定他们的析构函数之一不是导致错误的原因吗?