链表析构函数(C ++)

时间:2014-05-26 17:41:50

标签: c++

我有循环链表,我在调用析构函数时遇到问题。

这是列表的结构:

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,但我不确定其结果。谁能告诉我我做错了什么?

问题是主要功能结束后的段错误。 Valgrind说无效读取大小,报告100000多个错误。

2 个答案:

答案 0 :(得分:1)

如果列表是循环的,那么析构函数将是你编码它的无限循环(或俄语轮盘赌)。

应该有点像:

~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;
    }
}

答案 1 :(得分:0)

我认为你想要在你的析构函数中添加的是:

delete Next;

你目前所做的是错误的,因为:

  1. 在阅读 tmp1-> next
  2. 之前,你不检查 tmp1 是否为空
  3. 如果我按照你要做的那样,在第一个元素上调用析构函数将在所有下一个元素上调用 delete 。问题是,每当你在其中一个上调用 delete 时,它的析构函数也会在所有下一个上调用 delete ,所以你会尝试删除那些没有&#39的对象。 ; t不再存在。