链表析构函数(c++)

Linked list destructor (C++)

本文关键字:c++ 析构函数 链表      更新时间:2023-10-16

我有循环链表,我有调用析构函数的问题。

这是list的结构:

struct LList {
    LList(const string & name) : Next(NULL), Name(name) {
    }
    LList * Next;
    string Name;
};

这是我的代码:

~Class (){
    LList * tmp1= First;
    LList * tmp2;
    while(tmp1){
        tmp2=tmp1->Next;           
        delete tmp1;
        tmp1=tmp2;
    }
}

我试图使用valgrind,但我不确定它的结果。谁能告诉我我做错了什么?

问题是主函数结束后出现段故障。

如果列表是循环的,那么析构函数将是一个无限循环(或者是俄罗斯轮盘赌)。

它应该有点像:

~Class() {
    // break the circle
    LList cur = First;
    Llist nxt = head->Next;
    if (nxt) cur->Next = 0;
    cur = nxt;
    // walk through the list and delete nodes
    while (cur) {
        nxt = cur->Next;
        delete cur;
        cur = nxt;
    }
}

我认为你应该在析构函数中这样写:

delete Next;

你现在做的是错误的,因为:

  1. 在读取tmp1->next
  2. 之前不检查tmp1是否为null
  3. 如果我遵循你正在尝试做的,在第一个元素上调用析构函数将在所有接下来的元素上调用delete。问题是,每次在其中一个对象上调用delete时,它的析构函数也会在所有下一个对象上调用delete,所以您将尝试删除不再存在的对象。