假设我想为链表功能实现析构函数:
class LinkedList {
public:
LinkedList(int value, LinkedList* next);
~LinkedList();
int value();
LinkedList* next();
private:
int value;
LinkedList* next;
}
我的第一个想法是这样的:
LinkedList::~LinkedList {
LinkedList* first = this;
while (first != null) {
LinkedList* temp = first->next;
delete first;
first = temp;
}
}
这显然不起作用,因为我们有一个delete this
调用,它会递归地自我调用。但我不知道如何解决这个问题。我的下一个想法是:
LinkedList::~LinkedList() {
delete next;
}
但我不确定这实际上是否有效,因为它只是递归调用next
的删除方法,直到最终以NULL
结束。我将如何为LinkedList的这个实现实现析构函数方法?
答案 0 :(得分:0)
LinkedList::~LinkedList()
{
delete next;
}
应该有效。如果您有一个列表:A -> B -> C -> D
并删除A
(这是您的头),A
的析构函数将删除并调用B
的析构函数,这将删除并为C
调用析构函数,依此类推。 D
的析构函数有next = nullptr
,因此删除不执行任何操作。
但是,如果你有一个很长的列表并且析构函数不是编译器优化的尾调用,你可能会遇到堆栈溢出。