2017-03-31 89 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不会删除两个指针指向的同一个对象吗? –