不擦除std :: list :: iterator会使迭代器失效并破坏对象吗?

Kir*_*rov 5 c++ stl list erase

为什么以下打印2

list<int> l;
l.push_back( 1 );
l.push_back( 2 );
l.push_back( 3 );
list<int>::iterator i = l.begin();
i++;
l.erase( i );
cout << *i;
Run Code Online (Sandbox Code Playgroud)

我知道什么erase回归,但我想知道为什么这样可以?或者它是未定义的,还是依赖于编译器?

Vla*_*lad 15

是的,这是未定义的行为.你正在取消引用一种野性指针.你不应该使用iafter 的值erase.

是的,erase 破坏指向的对象.但是,对于POD类型,销毁不会做任何事情.

erase 没有为被擦除的迭代器分配任何特殊的"null"值,迭代器就不再有效了.