包含节点析构函数的列表

List with nodes destructor

本文关键字:列表 析构函数 节点 包含      更新时间:2023-10-16

在问我的问题之前,我知道这个问题和这个问题。

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

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循环破坏最后一个元素(没有递归调用析构函数)一切正常。

析构函数的递归调用数量是否有限制?我错过了吗别的东西?

这样可以避免递归:

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