鉴于我的标题:
#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循环是非常不必要的。
希望有人可以帮助我清理我的情况, 提前谢谢。
答案 0 :(得分:0)
是的,您的列表将以递归方式删除自己。但是,如果要删除列表中间的单个条目,则不能这样做,因为之后的所有元素也将被删除。
你和其他析构函数也有同样的问题。它仍将是递归的。
如果对设计进行少量更改并使用两个类将更容易:一个用于实际列表,一个用于列表中的节点。然后让列表处理所有节点的删除/删除,并保持节点结构尽可能简单(只有数据和next
指针,除了初始化数据和下一个指针的构造函数之外没有任何函数。) p>