LinkedList析构函数样式
LinkedList Destructor Style
给出以下标题:
#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;
}
}
如果我的想法是正确的,第二个例子也是递归的,因为"delete delptr"行。我的想法是delete delptr调用下一个列表项的析构函数,它也将创建一个"delptr",并继续为下一个项目调用析构函数。因此,我的堆栈看起来应该类似于我的第一个例子。我很确定我对删除对象的理解可能有错误。现在我觉得第二个例子中的while循环是完全没有必要的。
希望有人能帮助我澄清我的情况,
是的,您的列表将递归地删除自己。但是,如果您想删除列表中间的单个条目,则不能这样做,因为在此之后的所有元素也将被删除。
在使用其他析构函数时也会遇到同样的问题。它仍然是递归的
如果您在设计中做一个小的改变,并使用两个类会更容易:一个用于实际列表,另一个用于列表中的节点。然后让列表处理所有节点的移除/删除,并保持节点结构尽可能简单(只有数据和一个next
指针,除了初始化数据和next指针的构造函数之外没有函数)。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 内联映射初始化的动态atexit析构函数崩溃
- 什么时候调用析构函数
- 优先顺序:智能指针和类析构函数
- C++-明确何时以及如何调用析构函数
- 使用基类指针创建对象时,缺少派生类析构函数
- 在c++中使用向量时,如何调用构造函数和析构函数
- 重载运算符new[]的行为取决于析构函数
- 我需要知道编译器如何在cpp中使用析构函数
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 析构函数调用
- 通过引用传递-为什么要调用这个析构函数
- 对具有动态分配的内存和析构函数的类对象的引用
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- C++成员的析构函数顺序与shared_ptr
- C++ 防止在映射中放置()时调用析构函数
- 在这种情况下显式调用时,std::cout 如何更改析构函数的行为?
- 调用析构函数以释放动态分配的内存
- LinkedList析构函数样式