从开始 - 内存错误中删除链接列表

时间:2013-04-29 02:24:38

标签: c++ c++11

我正在尝试删除链接列表中的所有元素。 我使用了下面的代码,看起来它与./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 个答案:

答案 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之前遇到问题)。

通常,最后一个节点永远不会被释放。

这就是问题的原因。