C++ 映射C+中的迭代器无效+;

C++ 映射C+中的迭代器无效+;,c++,stl,C++,Stl,我有一个示例程序,在其中我试图查看迭代器在从映射中删除元素时是如何失效的 节目如下: #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(pa

我有一个示例程序,在其中我试图查看迭代器在从映射中删除元素时是如何失效的

节目如下:

#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;
}
为什么迭代器没有失效并给出错误的结果。任何帮助都将不胜感激

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


无效迭代器并不意味着其内部数据已被擦除。有时,与本例类似,无效迭代器可能持有对下一项的有效引用。但是,像这样使用它是未定义的行为,可能会在应用程序中引起一些问题。

默认情况下,不会对无效迭代器进行运行时检查

您可以为GNUC++标准库使用>DY-GLYBCXXXDEXGUD/Ung>的无效迭代器进行调试检查。这将产生以下运行时错误:

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
}

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

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

你为什么看到这些价值观?迭代器包含指向某个内存块的指针,纯属偶然,该内存尚未返回到系统,也尚未被覆盖。这就是为什么您仍然可以看到已经“死”的值


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

您在问为什么使用无效迭代器有时会起作用?这有点像是在问为什么人们在没有降落伞的情况下跳伞,有时他们会幸存下来,你的迭代器是无效的。您正在观察未定义行为的影响。取消引用无效迭代器是未定义的行为。它可以做任何事情,包括返回(看似)正确的值。那么,你是说它确实无效?是的,你是在调用未定义的行为。请注意,这是在UB的范围内工作的:标准说“任何事情都可能发生”,实现说“抛出异常符合任何事情”@Caleth将这种逻辑发挥到了极致,它甚至可以在没有调试迭代器的情况下打印此消息,但这种情况很少发生,以至于还没有被观察到。迂腐地说,标准不要求UB发生时有任何特定行为,这与“任何事情都可能发生”有很大不同。“不要求有任何特定行为”是的,但“不禁止任何特定行为”。换句话说,“任何事情都可能发生”
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
}