-1

我正在尝试在开始时删除链表中的所有元素。我使用了以下代码,它似乎与 ./a.out 兼容,但是,当我使用 valgrind ./a.out 时,它说存在内存错误。你能帮我解决这个问题吗?谢谢!

  void List::emptyTheList()

if (head==NULL)
{
    cout<<"there is no elements in the list" <<endl;

}

else
{
DR *temp1;//DR is a class
temp1=head->getNext();
while(temp1!=NULL)
{
    free(head);
    head=temp1;
    temp1=head->getNext();
}

}
4

4 回答 4

1

为什么我似乎是这个问题中唯一一个对使用和用于内存分配的C++链表有严重问题的人?显然,对象类具有成员函数。很可能它也有一个构造函数和一个析构函数。malloc()free()DR

关于清除前向链接列表的算法,这样做的标准算法是:

while (head)
{
    DR *temp1 = head;
    head = head->getNext();
    delete temp1;
}

假设您正确使用 C++ operator new(应该如此)进行分配。如果你不是,是时候开始这样做了,否则构造函数和析构函数都不会被正确触发。如果您的分配代码如下所示:

DR *node = (DR *)malloc(sizeofDR));

或类似的东西,停止它。改为这样做:

DR *node = new DR(constructor parameters here).
于 2013-04-29T04:00:37.537 回答
0

要解决问题,请考虑只有一个节点的情况。它永远不会被释放,因为永远不会进入循环。

如果你的代码已经过静态测试(或者你自己审查过,你可能会在 Valgrind 之前遇到问题)。

一般来说,最后一个节点永远不会被释放。

这就是问题的原因。

于 2013-04-29T03:45:35.240 回答
0

您的代码似乎在删除部分有错误。你为什么不试试这个:

temp1=head;
while(temp1!=NULL)
{
    head=temp1;
    temp1=temp1->next;
    free(head);
}
于 2013-04-29T02:40:22.637 回答
0

根据我的评论,您只需添加以下行即可解决问题:

free(head);

在“while”循环结束后。还有更好的方法来重新构建此代码。

于 2013-04-29T02:43:12.263 回答