【发布时间】:2016-11-16 06:22:10
【问题描述】:
我有一个链表,其中每个节点都指向下一个节点。基本上:
class List{
class Node{
Node():next_(NULL){}
~Node(){
if(next_){
delete next_;
next_ = NULL;
}
}
Node* next_;
}
List():head_(NULL),tail_(NULL){}
void add_node(){
tail_->next_ = new Node();
tail_ = tail_->next_;
}
Node* head_;
Node* tail_;
}
我删除了所有无用的信息,但上面给出的代码是 足以理解这个想法(至少我希望,我会根据要求更新它)。
我担心的是破坏部分。假设我有一个List
添加了许多带有add_node() 的节点。当List 析构函数被调用时,它
递归调用每个Node的析构函数,直到到达最后一个节点
其中有next_==NULL。因此,List 从头到尾都被破坏了。
直到今天我有一个清单,我从来没有遇到过这个问题 ~180000 个元素(相当大的内存使用量,但绝对不是压倒性的 RAM)返回一个段错误......
如果我做一个 while 循环来破坏最后一个元素(没有递归调用 析构函数)一切正常。
析构函数的递归调用是否有限制?我错过了吗 还有什么?
【问题讨论】:
-
递归太深。您是否需要为您的程序使用这种自制且可能不正确的数据结构?
-
我猜是这样...是的,它是无法真正更改的大型代码的一部分...我可以升级析构函数但无法更改整个类。跨度>
-
您将在列表析构函数中切换到迭代销毁,而不是在节点中使用递归。递归不能很好地扩展,因为您可以通过所有函数调用消耗所有堆栈空间。
-
这是一个优雅的解决方案......但我会改变它......我只是想确保这是一个可能的问题。如果有人告诉我这不会有问题,我会被卡住,因为我不知道还有什么可能导致我的段错误... thx
标签: c++ recursion linked-list destructor