首页 > 解决方案 > 递归导致程序崩溃,但 while 循环中的相同概念并非来自 C++ 析构函数

问题描述

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

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

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

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

然后在方法结束时调用 list 的析构函数:

~List()
{
    delete head;
}

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

~Node()
{
    delete next;
}

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

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

当我将 Node 析构函数留空并将 List 析构函数更改为:

~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++;
}

标签: c++recursionlinked-list

解决方案


该程序是正确的并且不是格式错误的。

问题来自内存限制。

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


推荐阅读