Supprimer liste liée
Hey je me le demande
J'ai écrit en C++ une liste liée, où j'appelle un destructeur de passer par un alloués liste, et supprimer chaque nœud trouvé. Cependant ce que j'ai trouvé est que, bien qu'il passe par la liste liée, et supprimer toutes les occurence, il sera toujours imprimer les valeurs. Bien que seulement quelques bouts de valeurs.
Mais ne devrait-elle pas être quand je supprime le linked_list il ne devrait pas être imprimable la prochaine fois?
Je vais créer une liste liée à l'aide de la new
, et delete
quand je l'ai supprimer de la liste
sorted_list::~sorted_list()
{
//Destructor implementation
destroy(this->first);
cout << "Destructor called sorted_list" << endl;
}
void sorted_list::destroy(list_link* item)
{
if (item)
{
destroy(item->next);
delete item;
}
}
fonction d'impression
void sorted_list::print() {
if(this->first)
{
iteratorn *traverse = new iteratorn(this->first);
while( !traverse->iterator_end() )
{
cout << traverse->iterator_get_key() << " ";
traverse->iterator_next();
}
delete traverse;
}
else
cout << "list empty" << endl;
}
Pas assez de code. Montrer le code qui génère la liste, et de montrer le code qui permet d'afficher les valeurs qu'il ne devrait pas.
Vous supprimez this->d'abord deux fois (une fois dans la détruire).
Vous n'avez pas besoin d'affecter
Pate @wilhelmtell merci pour l'entrée j'ai supprimer la double suppression de cette->premier maintenant
Vous supprimez this->d'abord deux fois (une fois dans la détruire).
Vous n'avez pas besoin d'affecter
NULL
(ou même à 0) à this->first
dans le destructeur. La liste est libéré, il a disparu, totalement inaccessible.Pate @wilhelmtell merci pour l'entrée j'ai supprimer la double suppression de cette->premier maintenant
OriginalL'auteur starcorn | 2010-11-06
Vous devez vous connecter pour publier un commentaire.
Lorsque vous accédez à un détruits objet, le comportement est indéfini. En fait, la suppression d'un objet n'est pas évident de la mémoire, de la marque juste disponible, donc si vous exécutez des opérations déjà supprimé objet, ils peuvent faire quelque chose de raisonnable. Mais encore une fois, l'objet est détruit, de sorte que vous ne doit pas y accéder.
Bien sûr, vous ne devriez pas conserver les pointeurs vers les objets appartenant à la liste, après avoir été détruits, parce que ces objets seront détruits ainsi.
Par ailleurs, votre
sorted_list::destroy
est récursif, ce qui est tout à fait inefficace. Vous devrez peut-être de le remplacer avec de l'approche itérative:(Et vous devriez le prendre en compte @Roger Pate du commentaire et de ne pas supprimer
this->first
la deuxième fois après l'appel dedestroy(this->first);
.)exactement!
ce n'est pas précis. Moderne compilateur C++ doit savoir comment optimiser loin au moins à la queue-récurrences. Ici, il est en fait simple pour convertir la récursivité à une queue-de récursivité, et le résultat du code objet, doit être identique à celle d'une boucle:
if( ! item ) return; list_link* next = item->next; delete item; destroy(next);
il est dangereux de pratiquer de supposer que l'optimiseur de manière à optimiser la récursivité pour vous. À moins qu'une telle optimisation est garantie par la norme C++, je ne voudrais pas compter sur elle.
J'ai essayé autour de, et toujours pas pourquoi j'ai encore de la ferraille valeurs. Je veux en fait le programme de crash lorsque j'essaie d'accéder à un déjà supprimé liste liée, mais au lieu de cela, il permet d'imprimer des débris de valeurs. J'ai ajouté dans ma fonction d'impression aussi.
OriginalL'auteur Vlad
Lors de la déclaration du lien, qui donne un air plus ou moins comme ceci:
Vous pourriez glisser un destructeur dans:
De cette façon, si vous souhaitez supprimer de la liste vous pouvez tout simplement:
MAGIQUE!!
OriginalL'auteur Kosta
Partie manquante est de détruire. Après la suppression, vous devez annuler le premier nœud au moins. Je voudrais annuler chaque nœud après les supprimer.
OriginalL'auteur Red.Wave