我正在创建一个链表类,链表的删除导致我的程序崩溃,但我不明白为什么即使我在调试模式下逐行跟踪它。
在 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++;
}
程序正确且格式不正确。
问题来自内存限制。
一种"解决方法"是通过迭代手动处理内存。