You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何链表deleteIndex函数使用delete无效?delete与free区别咨询

链表节点删除:delete与free混用的问题

你遇到的核心问题是C++中内存分配与释放函数的混用:用new创建的对象必须用delete释放,而free是C标准库的函数,仅适用于malloc/calloc分配的内存。混用两者会触发未定义行为——可能表面上没有报错,但实际上会导致内存泄漏、程序崩溃(在复杂场景下)或其他潜在问题。

你的代码存在的具体问题

1. deleteIndex函数的内存操作错误

  • 函数开头prev = new Node;、next = new Node;、deleted = new Node;完全多余:这些只是指针变量,不需要提前分配节点内存,后续赋值会直接覆盖这些指针,导致最初分配的节点永远无法释放,造成内存泄漏。
  • 使用free(deleted)释放new创建的节点,违反了C++内存管理规则,这就是你换成delete后看似“无效”的根源——其实不是delete无效,而是之前的错误操作导致了未定义行为,终端没报错不代表程序没问题。

2. 两个函数的边界情况缺失

  • deleteEnd没有处理空链表或只有一个节点的情况:如果链表只有一个节点,(refNode->next)->next会访问空指针,直接触发崩溃。
  • deleteIndex没有处理索引越界的情况:如果输入的索引超过链表长度,会访问空指针导致崩溃。

修正后的代码

首先,Node类可以添加构造函数简化初始化(可选,但推荐):

class Node {
public:
    int data;
    Node *next;
    Node(int val = 0) : data(val), next(nullptr) {}
};

修正后的deleteEnd函数

void deleteEnd(Node* refNode) {
    // 处理空链表
    if (refNode == nullptr) return;
    // 处理只有一个节点的情况(假设refNode是头节点)
    if (refNode->next == nullptr) {
        delete refNode;
        // 注意:如果要修改外部头指针,需要传引用或返回新头指针,避免野指针
        return;
    }
    Node* current = refNode;
    // 遍历到倒数第二个节点
    while (current->next->next != nullptr) {
        current = current->next;
    }
    Node* lastNode = current->next;
    current->next = nullptr;
    delete lastNode;
}

修正后的deleteIndex函数

void deleteIndex(Node* refNode, int index) {
    // 处理空链表或索引非法(假设索引从1开始)
    if (refNode == nullptr || index < 1) return;
    Node* current = refNode;
    // 遍历到目标节点的前一个节点
    for (int i = 1; i < index; ++i) {
        // 索引越界,直接返回
        if (current->next == nullptr) return;
        current = current->next;
    }
    // 目标节点不存在
    if (current->next == nullptr) return;
    Node* deleted = current->next;
    current->next = deleted->next;
    // 用delete释放new创建的节点
    delete deleted;
}

关键注意事项

  • 严格区分new/delete和malloc/free:C++中创建对象用new,释放必须用delete;C风格的内存分配才用malloc+free,绝对不能混用。
  • 指针变量不需要提前分配内存:只有当你需要创建新的节点对象时,才调用new,普通指针只需声明即可。
  • 必须处理边界情况:空链表、节点数量不足、索引越界等场景,避免空指针访问导致的崩溃。

内容的提问来源于stack exchange,提问作者Britindath

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 08:11:40