LinkedList析构函数样式

时间:2013-05-20 10:06:45

标签: c++ linked-list destructor

鉴于我的标题:

#ifndef LIST_H
#define LIST_H
#include "ListEle.h"
class List{
private: ListEle* data;
         const List* next;
public:  List(ListEle* d, List* n):data(d),next(n){}
         ~List(){
             if(data!=nullptr)delete data;
             if(next!=nullptr)delete next;
         }
};
#endif

我的列表会以递归方式自行删除吗?

然后我读了几个主题,声明使用递归析构函数(对于列表)最终会垃圾邮件堆栈。所以我搜索了一个替代方案,并找到了这样的例子:

~List(){
 delete data;
 List* delptr = next;
  while(delptr!=nullptr){
  List* temp = delptr->next;
  delete delptr;
  delptr = temp;
  }
}

如果我的想法是正确的,第二个例子也因为“删除delptr”行而以某种方式递归。我的想法是删除delptr调用我的下一个list-item的析构函数,它也会创建一个“delptr”并继续调用下一个项目的析构函数。因此,我的堆栈应该与我的第一个示例类似。我很确定在理解删除对象时可能会出错。目前我觉得我在第二个例子中的while循环是非常不必要的。

希望有人可以帮助我清理我的情况, 提前谢谢。

1 个答案:

答案 0 :(得分:0)

是的,您的列表将以递归方式删除自己。但是,如果要删除列表中间的单个条目,则不能这样做,因为之后的所有元素也将被删除。

你和其他析构函数也有同样的问题。它仍将是递归的。

如果对设计进行少量更改并使用两个类将更容易:一个用于实际列表,一个用于列表中的节点。然后让列表处理所有节点的删除/删除,并保持节点结构尽可能简单(只有数据和next指针,除了初始化数据和下一个指针的构造函数之外没有任何函数。) p>