Проверьте этот код:
#include "stdafx.h"#include <list>
int _tmain(int argc, _TCHAR* argv[])
{
std::list<int> mylist;
mylist.push_back(1);
std::list<int>::iterator i = mylist.end();
if( i == mylist.end() )
printf( "end is end\n" );
mylist.clear();
if( i == mylist.end() )
printf( "never get here because Microsoft seems to ""think the iterator is no longer safe.\n" );
return 0;
}
Теперь согласно cplusplus.com это не должно быть проблемой, и в режиме релиза я думаю, что это нормально и не вызывает никаких проблем, но отладка становится невозможной, так как это просто выдает ошибку, не давая мне продолжить. Есть указатели?
Другие ответы указывают на то, что в общем случае нельзя полагаться, что последний итератор контейнера остается действительным, когда контейнер очищается. Тем не менее, последний итератор списка должен действительно оставаться действительным:
C ++ 11 23.3.5.4/3 Последствия: Делает недействительными только итераторы и ссылки на стертые элементы.
Итератор конца-конца не ссылается ни на один элемент, поэтому не должен быть признан недействительным.
Из C ++ 11, Таблица 100 (Требования к контейнеру последовательностей):
clear()
[…] может лишить законной силы итератор.
А также std::list
это, конечно, шаблон контейнера последовательности (23.3.5.1/2):
Список удовлетворяет всем требованиям контейнера, обратимого контейнера (приведен в двух таблицах в 23.2), контейнера последовательности, включая большинство необязательных требований к контейнеру последовательностей (23.2.3) и контейнера, учитывающего распределитель (таблица 99). Исключениями являются оператор [] и функции-члены, которые не предусмотрены. Описания предоставлены здесь только для операций над списком, которые не описаны ни в одной из этих таблиц. или для операций, где есть дополнительная семантическая информация.
Это на самом деле неверно.
Итераторы действительны только для контейнера текущего состояния.
После добавления или удаления элементов итератор становится недействительным.
В статье, на которую вы ссылаетесь, не говорится, что вы делаете правильно. Они получают новый итератор после очистки.
Причина, по которой он не отображается в коде выпуска, заключается в том, что отладка, которая выявляет проблему, отключена.