编写LinkedList析构函数?

时间:2010-02-15 12:45:07

标签: c++ linked-list destructor

这是一个有效的LinkedList析构函数吗?我仍然对他们感到困惑。

我想确保我正确理解这一点。

 LinkedList::~LinkedList()
 {
   ListNode *ptr;

   for (ptr = head; head; ptr = head)
   {
     head = head->next
     delete ptr;
   }
}

因此,在循环开始时,指针ptr被设置为保存head的地址,即列表中的第一个节点。然后将head设置为下一个项目,该项目将在第一次删除后成为列表的开头。 ptr被删除,第一个节点也是如此。在循环的第一次迭代中,指针再次设置为head。

关注我的事情是到达最后一个节点。条件“头;”应检查它是否为空,但我不确定它是否会起作用。

任何帮助表示感谢。

6 个答案:

答案 0 :(得分:15)

为什么不做得更简单 - 使用优雅的while循环而不是试图仔细分析过度编译的for循环是否正确?

ListNode* current = head;
while( current != 0 ) {
    ListNode* next = current->next;
    delete current;
    current = next;
}
head = 0;

答案 1 :(得分:5)

您可以通过调试器运行它,或者您可以通过头骨内的那些湿软件运行它 - 两者都会向您显示它工作正常。例如,让我们从列表开始:

head(47) -> [47]single_node -> [NULL]end-of-list.

通过语句运行该列表:

  • ptr = headptr设置为47。
  • head非零,因此请输入循环。
  • head = head->nexthead设置为NULL。
  • delete ptr将删除single_node
  • ptr = headptr设置为NULL。
  • head现在为NULL(0),因此退出循环。

你去了,你删除了列表中唯一的条目,head现在设置为NULL。这就是你需要做的一切。

你可以用更长的列表或空列表做类似的事情,你会发现它仍然没问题(单元素列表和50元素列表之间没有真正的区别)。

顺便说一句,我并不是把指针视为布尔人的忠实粉丝 - 我宁愿把它写成像:

for (ptr = head; head != NULL; ptr = head)

在我看来,它使代码读得更好,你并没有真正牺牲任何性能(除非你有一个脑死亡的编译器)。但这是一个品味问题。

重新评论:

  

关注我的事情是到达最后一个节点。条件“头;”应检查它是否为空,但我不确定它是否会起作用。

它会起作用。零值将被视为假,因此你会发现你永远不会取消引用head-> next当head为NULL时,因为你将在该点之前退出循环体(如果列表是空)。

任何其他指针值都将被视为true,您将进入或继续循环体。

答案 2 :(得分:3)

  
    

条件“头;”应检查它是否为空,但我不确定它是否会起作用。

  

是的,“head”本身与“head!= null”相同 - 但是为什么使用无意义的打字快捷方式,即使你发现它令人困惑?它只有6次击键(并产生相同的机器代码),所以选择长形式。

此外,您的代码比必要的要复杂一点,因为您使用的是for()构造。为什么不使用while()?你的代码会更清晰。

最后,我意识到你这是一个学习练习,但要记住列表<>在标准库中---链接列表是官方的“解决问题”。

答案 3 :(得分:2)

测试好了

类列表的析构函数

List::~List()
{
    Node *n = this->front, *current = NULL; //initialization part

    while(n)                               //start cleanup of nodes of the list
    {
        current = n;
        n=n->next;
        delete(current);
    }

    front = end = NULL;
}

答案 4 :(得分:0)

您的代码可能是正确的,您应该尝试使用例如valgrind看看它说的是什么。但是,我会这样写:

for (ListNode *current = head, *next; current; current = next) {
    next = current->next;
    free(current);
}

答案 5 :(得分:0)

这是使用Linked-List的析构函数释放/删除内存的更好方法。

def upload_file(request):
    if request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            handle_uploaded_file(request.FILES['file'])
            return HttpResponseRedirect('/success/url/')
    else:
        form = UploadFileForm()
    return render(request, 'upload.html', {'form': form})
def handle_uploaded_file(f):
    with open('some/file/name.txt', 'wb+') as destination:
        for chunk in f.chunks():
            destination.write(chunk)