我正在尝试在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);
为什么会崩溃以及如何修复?
答案 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;