2013-04-29 38 views
-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

该代码没有正确缩进,也不会编译。 (这个方法没有开头的括号。)你能解决这些问题吗?然后我们会很好的回答这个问题。 – sigpwned 2013-04-29 02:27:04

+0

另外,“列表中没有元素”应该阅读“列表中没有元素”,如果您希望语法正确 Ozraptor 2013-04-29 02:30:01

+0

就代码的逻辑流程而言,它看起来像我从来没有释放列表中的最后一个元素?当'head'被分配给列表的最后一个元素时,temp1可能会被'head-> getNext()'设置为null,这会在释放最后一个元素之前导致while循环退出)。这可能是Valgrind抱怨的内存泄漏/问题。当您按照sigpwned的要求提供适当的代码示例时,可以确认。 – Ozraptor 2013-04-29 02:39:12

回答

0

您的代码似乎在删除部分有问题。 “而”循环结束后

free(head); 

:你为什么不试试这个:

temp1=head; 
while(temp1!=NULL) 
{ 
    head=temp1; 
    temp1=temp1->next; 
    free(head); 
} 
0

按我的意见,你可以简单地通过增加线解决问题。还有更好的方法来重新构建这些代码。

0

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

如果您的代码已经过静态测试(或者您已经自行审查过,您可能会在Valgrind之前发现问题)。

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

这是问题的原因。

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).