我正在尝试删除链接列表中的所有元素。 我使用了下面的代码,看起来它与./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();
}
}
答案 0 :(得分:1)
为什么我似乎是这个问题中唯一一个使用malloc()
和free()
进行内存分配的 C ++ 链接列表存在严重问题的人?显然,对象类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).
答案 1 :(得分:0)
您的代码似乎在删除部分中有错误。你为什么不试试这个:
temp1=head;
while(temp1!=NULL)
{
head=temp1;
temp1=temp1->next;
free(head);
}
答案 2 :(得分:0)
根据我的评论,您可以通过添加以下行来解决问题:
free(head);
在'while'循环结束后。还有更好的方法来重新构造此代码。
答案 3 :(得分:0)
要解决问题,请考虑只有一个节点的情况。 它将永远不会被释放,因为永远不会输入循环。
如果您的代码已经过静态测试(或者您已经自己进行了审核,那么您可能会在Valgrind之前遇到问题)。
通常,最后一个节点永远不会被释放。
这就是问题的原因。