【发布时间】:2016-11-15 17:23:07
【问题描述】:
我有一个由Node 对象构建的链表:
class Node {
public:
Node(string data);
Node* GetNext() const;
void SetNext(Node* nextNode);
~Node();
private:
string data;
Node* next;
};
析构函数定义如下:
Node::~Node() {
delete next;
}
应该在哪里调用析构函数Node。
我的问题是:像这样删除单链表会导致大列表上的堆栈溢出(它适用于小型列表,即
while (head->GetNext() != 0) {
Node* temp = head->GetNext();
head->SetNext(temp->GetNext());
delete temp;
}
delete head;
Node 没有定义的构造函数?
【问题讨论】:
-
我没有得到这些奇怪的链表实现,其中节点正在破坏自身和链中的任何其他节点。如果我想从列表中删除单个节点,我会怎么做?更好的选择是创建一个链表类,其中成员是一个节点指针,链表类删除和分配它认为合适的节点。 Node 类根本不应该有任何用户定义的析构函数。
-
它很容易导致堆栈溢出。在你的链表上抛出一百万个节点并试一试。
-
“会像这样删除单链表导致大列表上的堆栈溢出”。当然,你自己测试应该很容易
-
迭代版本更适合 Stack Overflow,因为它不是递归的。为什么不在具有
Node* head的class List中实施销毁? -
好吧,我们在这里讨论的是动态分配的指针,所以从技术上讲,我认为我们讨论的是堆溢出。
标签: c++ pointers recursion memory-management linked-list