c++ - 析构函数中的链表 RAII 代码崩溃

标签 c++ linked-list raii

我试图在 RAII 精神中创建一个链接列表,但我在一个析构函数中遇到崩溃,我在其中调用了同一类对象的析构。我得到堆栈溢出,但前提是链表已填充到某个数字。代码:

struct Node
{
    static int created,deleted;

    Node* next;
    Node () : next(NULL) { created++; }

    ~Node()
    {
        deleted++;

        if(next)
            delete next;
    }
};

int Node::created = 0;
int Node::deleted = 0;

class LL
{
    Node root;
    Node* cur;

    public:

        LL() : cur(&root) { }

        void add()
        {
            this->cur = this->cur->next = new Node;
        }
};

现在,这段代码不会崩溃:

{
    LL l;

    for(int i=1;i<=1000;i++)
        l.add();
}

printf("Created %d, Deleted %d\n",Node::created,Node::deleted);

但是这个确实:

{
    LL l;

    for(int i=1;i<=5000;i++)
        l.add();
}

printf("Created %d, Deleted %d\n",Node::created,Node::deleted);

为什么会崩溃,应该如何修复?

最佳答案

让我们再试一次。

Node 的析构函数中删除指针,它调用下一个 Node 的析构函数,等等。这是递归发生的。您只是用完了堆栈空间。

关于c++ - 析构函数中的链表 RAII 代码崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21323576/

相关文章:

c++ - 比较链表,C++,顺序相同但可以不同

c++ - 在 CTOR 和智能指针中抛出异常

c++ - 构造函数返回值中的异常

c++ - 这两种初始化成员变量的方法有区别吗?

c++ - 从 C++ 输出中删除逗号

c++ - 在 main 中搜索字符串结尾时出现段错误,但在 C++ 函数中却没有

java - 迭代方法: Delete Linked List node using only one reference variable

c++ - 使用 STL 在 list<MyStruct> 中查找成员的最小值

c++ - 将元素添加到链表的区别

c++ - 如何确保正确销毁 vk::UniqueBuffer 和 vk::UniqueDeviceMemory