析构函数内的链接列表RAII代码崩溃

时间:2014-01-24 02:53:50

标签: 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);

为什么会崩溃以及如何修复?

2 个答案:

答案 0 :(得分:2)

让我们再试一次。

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

答案 1 :(得分:-1)

在同一语句中读取和写入变量可能不是一个好主意。

更改此行:

        this->cur = this->cur->next = new Node;

        cur->next = new Node;  // Add node
        cur       = cur->next; // Move end marker.

也不需要这样做。

        if(next)
            delete next;

只是做:

        delete next;