Вы не удаляете элемент из вектора. Таким образом, векторный элемент указывает на местоположение, как раньше, т. Е. Тот же T. Однако, поскольку вы удалили это T, вы больше не можете разыскивать указатель - это будет UB и может привести к сбою вашей программы.
delete
вызывает деструктор T (отлично, это то, что вы должны делать), но delete
не меняет вектор. Следовательно, итератор действителен все время.
Либо вы должны удалить элемент, для которого вы вызвали delete, или, по крайней мере, установить векторный элемент в nullptr.
typename std::vector<T*>::iterator it;
for (it=std::vector<T*>::begin();it!=std::vector<T*>::end();it++)
{
delete *it;
*it = nullptr; // Only needed when you don't erase the vector element
}
Это решение требует, чтобы вы всегда проверять nullptr перед использованием любого элемента вектора.
В большинстве случаев лучшим решением является удаление элемента из вектора.
В случае, если вы уничтожаете все элементы, вызывая delete
на каждый элемент, просто вызовите clear
на вектор после цикла.
Я мог бы. Но вы не дали понять, на что вы на самом деле застряли. – doctorlove
Посмотрите, что делает 'delete'. Код построен на суевериях и предрассудках. Затем изучите урок. Программирование - это не акт веры. –
Ther не нужно 'if (* it)'. – Rabbid76