为什么我不能对这一行使用"删除"?



我今天开始学习链表,我正在尝试删除节点。

void deleteEnd(Node* refNode) {
Node* lastNode;
lastNode = new Node;
while((refNode->next)->next != NULL) {
refNode = refNode->next;
}
lastNode = refNode->next;
refNode->next = NULL;
delete lastNode;
}
void deleteIndex(Node* refNode, int index) {
Node *prev, *next, *deleted;
prev = new Node;
next = new Node;
deleted = new Node;
for(int i=1; i < index; i++) {
refNode = refNode->next;
}
prev = refNode;
deleted = prev->next;
next = deleted->next;
prev->next = next;
free(deleted);
}

我可以在第一个中使用delete,但当我尝试在第二个中使用它时,它不起作用。终端没有给出任何错误消息。

我在网上找到了一些信息,但我真的无法理解

这是我的链接列表:

class Node {
public:
int data;
Node *next;
};

正如评论所指出的,这段代码有几个问题。所有问题都来自评论,我没有发现,所有的功劳都归于弗朗索瓦·安德里厄、Jesper Juhl、Sven Nilson、Avi Berger和Thomas Matthews。

首先,代码可能不起作用,因为您混合了newfreenew是一个C++API函数,而free来自C。当您使用new构造对象时,必须使用delete释放它,这在C++的自动内存管理中并不常见。

第二,当在列表中循环时,始终从0开始。否则的唯一原因是从第二个项目开始。

第三,在本文中:

prev = new Node;
...
prev = refNode;
...
prev->next = next;

当您设置prev时,它将覆盖以前的值。如果这是一个指针,那么这会导致内存泄漏。重写前始终delete

最后,正如Thomas Matthews所指出的,在deleteEnd中,您试图取消引用指针或从指针中获取值,而不检查它是否为nullptr。如果是,它将导致未定义的行为,并可能导致程序崩溃。

最新更新