繁体   English   中英

映射C ++中的迭代器失效

[英]iterator invalidation in map C++

我有一个示例程序,我试图在从地图中删除元素时看到迭代器如何失效。

该计划在这里:

#include <iostream>
#include <map>

using namespace std;

int main(int argc, char *argv[])
{

    map<int, int> myMap;

    myMap.insert(pair<int, int>(0, 2));    
    myMap.insert(pair<int, int>(1, 4));    
    myMap.insert(pair<int, int>(3, 18));    
    myMap.insert(pair<int, int>(2, 20));    

    map<int, int>::iterator it; 

    for(it = myMap.begin(); it != myMap.end(); ++it) 
    {   
        myMap.erase(it);  // erasing the element pointed at by iterator

        cout << it->first << endl; // iterator is invalid here 
    }   
    return 0;
}

问题是我得到的输出是:

0
1
2
3  

为什么迭代器不会失效并给我错误的结果。 任何帮助将受到高度赞赏。

C ++ STL映射的文档说:擦除元素的引用和迭代器无效。 其他引用和迭代器不受影响。

使用无效的迭代器是未定义的行为 在这种情况下,任何事情都可能发生

你为什么看到价值观? 迭代器包含指向某段内存的指针, 纯属意外 ,此内存尚未返回系统并且尚未被覆盖。 这就是为什么你仍然可以看到已经“死”的值。

它不会改变任何东西,它仍然是未定义的行为,并且下次运行程序时,map元素所在的内存页面可能已经再次返回到操作系统,并且您获得了访问冲突(分段错误)...

无效的迭代器并不意味着其内部数据已被删除。 有时在这种情况下,无效的迭代器可以保存对下一个项的有效引用。 但是,像这样使用它是未定义的行为,它可能会在您的应用程序中导致一些问题。

默认情况下,没有对无效迭代器的运行时检查。

您可以使用-D_GLIBCXX_DEBUG为GNU C ++标准库启用无效迭代器的调试检查。 这会产生以下运行时错误:

iterator "this" @ 0x0x7fff9f3d7060 {
type = N11__gnu_debug14_Safe_iteratorISt17_Rb_tree_iteratorISt4pairIKiiEENSt7__debug3mapIiiSt4lessIiESaIS4_EEEEE (mutable iterator);
  state = singular;
  references sequence with type `NSt7__debug3mapIiiSt4lessIiESaISt4pairIKiiEEEE' @ 0x0x7fff9f3d7150
}

对于其他标准库,请查看文档。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM