2017-03-31 96 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; 

我的問題是,爲什麼traversePointer未分配在while循環如錯誤所示?

+0

,但你的問題是什麼? – user463035818

+0

在一個循環鏈表中,什麼讓你認爲'this-> head = this-> head-> getNext();'當你回到開始時會工作嗎?使用調試器... –

+2

這個錯誤非常坦率地描述性很強......你應該真的很高興......我希望我收到這些類型的錯誤...... – WhiZTiM

回答

0

的同時應該是:

while(this->size){ 

當循環完成,則設置這個 - >頭= nullptr。沒有必要在循環中設置traversePoitner = nullptr。

替代版本(我還沒有證實這還),即不依賴於這個 - >尺寸是正確的,只是名單是圓形:

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

當我已經刪除並將traversePoitner設置爲null時,爲什麼我需要設置this-> head = nullptr?最後遍歷指針將與頭相同。因此將遍歷指針設置爲null會自動將頭指針設置爲null。 –

+0

@IdreesAshraf - this-> head是一個指向節點的指針。 traversePointer是一個單獨的指向節點的指針和this-> head的副本,而不是對this-> head的引用。此外,當循環完成時,this-> head將回到它的原始值,因爲它是一個循環列表。 – rcgldr

+0

我明白了。只是有點混亂,traversePoiner和頭指針指向同一個對象。所以如果我刪除traversePointer不會刪除兩個指針指向的同一個對象嗎? –