Does std:: list:: clear invalidate std:: list:: end iterator?
Проверьте этот код:
#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, это не должно быть проблемой, и в режиме выпуска я думаю, что это нормально, t действительно вызывает какие-либо проблемы, но отладка становится невозможной, так как это просто освобождает, не позволяя мне продолжать. Любые указатели?
Ответы
Ответ 1
В других ответах указывается, что в целом вы не можете полагаться на контейнерный итератор, остающийся действительным, когда контейнер очищается. Тем не менее, прошлый итератор списка должен действительно оставаться в силе:
С++ 11 23.3.5.4/3 Эффекты: аннулирует только итераторы и ссылки на стираемые элементы.
Итератор прошедшего конца не ссылается ни на какой элемент, поэтому не должен быть признан недействительным.
Ответ 2
Из С++ 11, Таблица 100 (Требования к контейнерам последовательности):
clear()
[...] может аннулировать итератор прошедшего конца.
И std::list
- это, конечно, шаблон контейнера последовательности (23.3.5.1/2):
Список удовлетворяет всем требованиям контейнера, обратимого контейнера (приведенного в двух таблицах в 23.2), контейнера последовательности, включая большинство необязательных требований контейнера последовательности (23.2. 3) и контейнера, поддерживающего распределитель (таблица 99). Исключениями являются оператор [] и функции-члены, которые не предусмотрены. Описания приведены здесь только для операций над списком, которые не описаны в одной из этих таблиц или для операций, где имеется дополнительная семантическая информация.
Ответ 3
Это действительно недействительно.
Итераторы действительны только для текущего контейнера состояния.
Когда вы добавляете или удаляете элементы, итератор больше не действует.
В статье, которую вы указываете, не указано, что вы делаете. Они получают новый итератор после ясного.
Причина, по которой он не отображается в коде выпуска, заключается в том, что отладка, которая устраняет проблему, отключена.