【问题标题】:List with nodes destructor带有节点析构函数的列表
【发布时间】:2016-11-16 06:22:10
【问题描述】:

在问我的问题之前,我知道thisthis 的问题。

我有一个链表,其中每个节点都指向下一个节点。基本上:

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


【解决方案1】:

这样可以避免递归:

~Node(){
    while(next_)
    {
        Node* temp = next_->next_;
        next_->next_ = NULL;
        delete next_;
        next_ = temp;
    }
}

【讨论】:

    猜你喜欢
    • 2014-05-27
    • 2016-01-08
    • 2021-03-22
    • 2015-03-01
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    相关资源
    最近更新 更多