2017-03-31 4 views
-1

J'essaie de supprimer tous les nœuds dans une liste chaînée circulaire unique. Mais je me suis suivante Erreur:Liste de liens circulaire C++ - supprimer tous les nœuds

malloc: *** error for object 0x1005068f0: pointer being freed was not allocated 

Suite est la fonction:

void StudentLinkList::removeAll() { 
    StudentData *traversePointer = this->head; 

    while (this->head != nullptr) { 
     this->head = this->head->getNext(); 
     delete traversePointer; 
     traversePointer = nullptr; 
     traversePointer = this->head; 
     this->size--; 
    } 
} 

J'obtiens l'erreur sur cette ligne:

delete traversePointer; 

Ma question est que pourquoi traversePointer non allouée dans while comme indiqué dans l'erreur?

+0

vous voulez probablement corriger l'erreur, mais quelle est ta question? – user463035818

+0

Dans une liste chaînée circulaire, qu'est-ce qui vous fait penser 'this-> head = this-> head-> getNext();' fonctionnera quand vous reviendrez au début? Utilisez un débogueur .... –

+2

L'erreur est franchement très descriptive ... Vous devriez être vraiment heureux à ce sujet ... Je souhaite avoir reçu ce genre d'erreurs ... – WhiZTiM

Répondre

0

Le tout devrait être:

while(this->size){ 

Lorsque la boucle est terminée, puis réglez this-> = tête nullptr. Il n'est pas nécessaire de définir le paramètre traversePoitner = nullptr dans la boucle.

Version alternative (je ne l'ai pas encore confirmé), qui ne repose pas sur this-> taille est correcte, à seulement que la liste est circulaire:

void StudentLinkList::removeAll() { 
    if(this->head == nullptr) 
     return; 
    StudentData *traversePointer = this->head; 
    StudentData *deletePointer; 
    do{ 
     deletePointer = traversePointer; 
     traversePointer = traversePointer->getNext(); 
     delete deletePointer; 
    }while(traversePointer != this->head); 
    this->head = nullptr; 
    this->size = 0; 
} 
+0

Pourquoi ai-je besoin de définir this-> head = nullptr alors que je suis déjà en train de supprimer et de définir le chemin de traverse à null? À la fin, le pointeur de la traversée sera le même que la tête. Par conséquent, si vous définissez le pointeur de traverse sur null, le pointeur de la tête sera automatiquement défini sur null. –

+0

@IdreesAshraf - this-> head est un pointeur vers un noeud. traversePointer est un pointeur distinct vers le noeud et une copie de this-> head, pas une référence à this-> head. De plus, lorsque la boucle est terminée, this-> head reviendra à sa valeur d'origine car il s'agit d'une liste circulaire. – rcgldr

+0

Je l'ai eu. Juste un peu de confusion, traversePoiner et le pointeur de la tête pointent vers le même objet. Donc, si je supprime traversePointer ne supprimera-t-il pas le même objet que les deux pointeurs pointent vers? –