C ++ 11 forward_list迭代器仍然指向已删除的值

时间:2015-05-10 18:09:53

标签: c++ c++11 iterator forward-list

迭代器仍然指向它先前执行的元素,并且它指向的值不会从内存中删除。我想知道怎么解释这个?谢谢。

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"

2 个答案:

答案 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;