迭代器仍然指向它先前执行的元素,并且它指向的值不会从内存中删除。我想知道怎么解释这个?谢谢。
forward_list<int> Fwdl {46, 21, 88, 901, 404};
auto it = Fwdl.begin();
Fwdl.remove(46);
cout << "List : "; for(int& elem : Fwdl) cout << " " << elem; cout << endl;
//This prints "List : 21 88 901 404" as expected, but:
cout << "Iterator is alive! " << *it << endl;
//This still prints "Iterator is alive! 46"
答案 0 :(得分:2)
如其中一条评论中所述,取消引用无效的迭代器是未定义的行为。在你的情况下,它可能仍然指向堆上的元素所在的空间,并且还没有被其他东西覆盖。在不同的编译器或程序的不同运行中,它可能是乱七八糟或完全崩溃程序。
答案 1 :(得分:2)
N4431 - 23.3.5.5/15列表操作[list.ops] (强调我的)
void remove(const T& value);
template <class Predicate> void remove_if(Predicate pred);
效果:删除列表迭代器
i
引用的列表中的所有元素,其中包含以下条件:*i == value, pred(*i) != false
。 仅使迭代器和对已擦除元素的引用无效。
您拥有的是未定义行为的典型表现形式,您不应该依赖此类代码。
可能发生的事情类似于此:
int* p = new int(42);
int* iterator = p;
delete p;
// may still display 42, since the memory may have not yet been reclaimed by the OS,
// but it is Undefined Behaviour
std::cout << *iterator;