1

鉴于我的以下标题:

#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”行而以某种方式递归。我的想法是 delete delptr 调用我的下一个列表项的析构函数,这也将创建一个“delptr”并继续为下一个项目调用析构函数。因此我的堆栈应该与我的第一个示例相似。我很确定我对删除对象的理解可能有误。目前我觉得我在第二个例子中的 while 循环是完全没有必要的。

希望有人可以帮助我清除我的情况,在此先感谢。

4

1 回答 1

0

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

你和其他人也有同样的问题,其他析构函数也是如此。它仍然是递归的。

如果您在设计中做一点小改动,并使用两个类会更容易:一个用于实际列表,另一个用于列表中的节点。然后让列表处理所有节点的移除/删除,并保持节点结构尽可能简单(只有数据和next指针,除了初始化数据和下一个指针的构造函数之外没有其他功能)。

于 2013-05-20T10:11:20.717 回答