递归导致程序崩溃,但 while 循环中的相同概念不是来自C++析构函数



我正在创建一个链表类,链表的删除导致我的程序崩溃,但我不明白为什么即使我在调试模式下逐行跟踪它。

在 main 方法中,我创建列表并实例化值:

List list = List(new Node(rand()));
while (list.size < 10000)
{
list.add(rand());
}

该列表接收节点指针,并分配给名为 head 的成员节点指针。该节点还有另一个成员变量,它是一个称为 size 的整数。

然后在方法的末尾调用列表的析构函数:

~List()
{
delete head;
}

并且该 destuctor 正在调用头节点的析构函数,该构造函数是:

~Node()
{
delete next;
}

每个节点都有一个名为 next 的节点指针,该指针指向列表中的下一个节点,如果它是终止删除调用的结束,则指向 nullptr。

最让我困惑的是,这确实适用于 2000 年以下的所有值,但是,在 2000 年代的某个时候,它会导致程序崩溃。

当我将节点析构函数留空并将列表析构函数更改为:

~List()
{
while (head)
{
Node* temp = head->next;
std::cout << head->value << std::endl;
delete head;
head = temp;
}
size = 0;
}

该程序正在运行,并且正在摆脱链表中的所有节点。据我所知,我应用了相同的原则,因此递归调用,所以我不知道是什么导致了崩溃。

节点结构:

int value;
Node* next;
Node(int val, Node* node = nullptr)
{
value = val;
next = node;
}
~Node()
{
//delete next;
}

列表结构:

Node* head;
int size;
List(Node* val)
{
head = val;
size = 1;
}
~List()
{
//delete head;
while (head)
{
Node* temp = head->next;
std::cout << head->value << std::endl;
delete head;
head = temp;
}
size = 0;
}
void add(int value)
{
head = new Node(value, head);
size++;
}

程序正确且格式不正确。

问题来自内存限制。

一种"解决方法"是通过迭代手动处理内存。

最新更新