2016-05-20 2 views
3

Я пытаюсь удалить узел в связанном списке, используя mylist.erase();, но узел остается в списке. Я пытался использовать delete(), но программа вылетает. Есть идеи?C++ не удалось удалить узел в связанном списке

list <Person*> :: iterator it; 
it = gamelist.begin(); //gamelist is a <Person*> list. it is an iterator to this list. 
while (it!=gamelist.end()){ 
    if ((*it)->is_dead == true) { 
     delete (*it); //if I comment this line the program does not crash but the "dead" Person still remains in the list. 
     it = gamelist.erase(it); 
    } 
    else ++it; 
} 
+2

Привет, вы пытались играть в gamelist.erase, а затем удалять? –

+0

Привет @JuanPablo. Да, я попробовал. Такая же проблема ... –

+2

Вы уверены, что вы 'new'ed память @' * it' и что она еще не освобождена? Вы можете попробовать сохранить '* it' во временном' Person * ', удалить и удалить временное. –

ответ

4

Удаление указателя не влияет на то, остается ли указатель в контейнере. Поскольку вы не показали программу, демонстрирующую, что узел остается в списке, я полагаю, что он не остается после вызова erase.

Если вы выделили остроконечный объект new, тогда вы должны в какой-то момент указать delete. Если программа выйдет из строя при удалении указателя здесь, это означает, что либо

  • Указатель не инициализирован и никогда не указывал на действительный объект.
  • Указатель был действительным, но заостренный объект уже был уничтожен, а указатель уже недействителен.
  • Указатель действителен, но указывает на объект, который не был создан с помощью new.
  • Указанный объект не находится в допустимом состоянии, от которого зависит его деструктор.

Это не представляется возможным «тест» действительность указателя в программе (для проверки, является ли его недействительным, но удаление нуль в порядке и не врезаться, за исключением, так что это не проблема в вашем случае) , Вы должны проанализировать свою программу и гарантировать действительность самостоятельно. Умные указатели намного легче рассуждать о правильности указателей. Я рекомендую вам их использовать.

+0

Итак, для Тео, вы должны проверить свой код, где вы вставляете элементы _insert_, и убедитесь, что они либо указатели, созданные с помощью 'new', либо' NULL'. – Sheljohn

+1

@ Sh3ljohn никогда не нужно проверять, что при удалении указатель не равен нулю. Указатель должен указывать на действительный объект, только если он не равен нулю. – user2079303

+0

«Во всех случаях, если ptr является нулевым указателем, стандартные функции освобождения библиотеки ничего не делают». [[C++ std] (http://en.cppreference.com/w/cpp/memory/new/operator_delete)] Я не знал этого, спасибо. Я редактировал свой предыдущий комментарий. :) – Sheljohn