【问题标题】:Why can't I use 'delete' for this line?为什么我不能对这一行使用 \'delete\'?
【发布时间】:2022-10-07 07:59:25
【问题描述】:

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

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;
};
  • 您不能将freenew 混合使用。如果您使用new,则必须使用deletefree 只能用于释放您使用malloc(和相关函数)分配的内存。
  • 请,请,请,在现代 C++ 中使用手动内存管理。.如果您的教材告诉您这样做,请获取更新的材料。如果您的老师告诉您这样做,请停止倾听并找一个更好的老师。
  • C 中的计数通常从 0 开始,以防万一您在此处遇到错误:for(int i=1; i < index; i++)。这行也没有多大意义:deleted = new Node;
  • 显然,手动内存管理不是要走的路。但在任何类型的 C++ 教材中,用户还需要了解幕后发生的事情。这个怎么运作。以及为什么自动内存管理更好。也许这个人的老师选择了保留那节课,直到他们用手动方法挣扎了一段时间。
  • 经典链表数据结构讨论使用指针或链接;不是智能指针。恕我直言,比使用智能指针更容易理解。

标签: c++ linked-list free delete-operator


【解决方案1】:

正如 cmets 所指出的,这段代码有几个问题。所有问题都来自 cmets,我没有发现任何问题,所有功劳归于 François AndrieuxJesper JuhlSven NilsonnAvi BergerThomas Matthews

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

其次,当遍历一个列表时,总是从 0 开始。否则唯一的原因就是从第二个项目开始。

第三,在这段话中:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-27
    • 2012-06-15
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多