2017-03-31 1 views
-1

単一循環リンクリスト内のすべてのノードを削除しようとしています。しかし、私はエラーを次しまっ:後C++循環リンクリスト - すべてのノードを削除する

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

は関数である。

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--; 
    } 
} 

私はこの行のエラーを取得:

delete traversePointer; 

私の質問は、なぜwhileループに割り当てられていないtraversePointerということですエラーのように?

+0

は、あなたの質問は何ですか? – user463035818

+0

循環リンクされたリストで、 'this-> head = this-> get-> getNext();は、あなたが最初に戻ったときに動作すると思いますか?デバッガを使用してください.... –

+2

エラーは非常に率直に非常に説明的です...あなたは本当にうれしいです...私はこれらの種類のエラーを受けたがっています... – WhiZTiM

答えて

0

一方がなければならない:ループが完了すると、次にthis->ヘッド= nullptrを設定

while(this->size){ 

。ループ内にtraversePoitner = nullptrを設定する必要はありません。

リストが円形であることだけが、正しいことthis->サイズに依存しない代替バージョン(私はこれをまだ確認していない)、:あなたはおそらくエラーを修正したい

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

すでに削除しているときにthis-> head = nullptrを設定し、traversePoitnerをnullに設定する必要があるのはなぜですか?最後に、トラバースポインタはヘッドと同じになります。トラバースポインタをnullに設定すると、ヘッドポインタが自動的にnullに設定されます。 –

+0

@IdreesAshraf - this-> headはノードへのポインタです。 traversePointerは、ノードとthis-> headへの参照ではなく、this-> headのコピーへの別のポインタです。また、ループが完了すると、this-> headは循環リストなので元の値に戻ります。 – rcgldr

+0

私はそれを得た。ちょっと混乱、traversePoinerとヘッドポインターが同じオブジェクトを指しています。したがって、traversePointerを削除しても、両方のポインタが指す同じオブジェクトが削除されませんか? –

関連する問題