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

C++内存释放方法及add_flat函数delete后Head值异常问题求助

C++链表内存管理问题:添加节点后delete导致Head返回垃圾值

核心问题

你犯了基础的内存管理逻辑错误:刚用new创建节点并插入链表,立刻就用delete把它销毁了。

new Flat()在堆上分配内存,你将这个节点插入链表后,Head(或链表其他节点)已经指向这块内存。但随后的delete new_flat直接释放了该内存,此时链表中的指针变成悬空指针,访问它的成员(比如Head->id)必然得到垃圾值,这属于C++的未定义行为。

这和析构函数无关,你完全搞反了new/delete的使用场景:

  • new是用来创建需要长期存在的对象(比如链表节点,要留在链表中直到被移除)
  • delete是当你彻底不再需要这个对象时,才去释放它占用的内存

修复步骤

  1. 删除delete new_flat;语句:让新创建的节点留在链表中供后续使用。
  2. 给FlatList添加析构函数:在链表对象销毁时,遍历所有节点逐个释放内存,避免内存泄漏。

修改后的代码示例

修正后的add_flat函数

void FlatList::add_flat(int index,int initial_bandwith,int flat_id) {

    Flat* new_flat = new Flat() ;

    new_flat->id = flat_id ;
    new_flat->initial_bandwidth = initial_bandwith ;
    new_flat->is_empty = false ;

    Flat* current = Head ;

    if (index == 0 ) {
        new_flat->next_Flat = Head ;
        // 新增判断:避免链表为空时访问空指针的成员
        if (Head != nullptr) {
            Head->prev_Flat = new_flat ;
        }
        Head = new_flat ;

    } else {
        for (int i = 0 ; i < index ; i++) {
            current = current->next_Flat ;
        }

        current->prev_Flat->next_Flat = new_flat ;
        new_flat->prev_Flat = current->prev_Flat ;
        current->prev_Flat = new_flat ;
        new_flat->next_Flat = current ;
    }

    // 移除delete new_flat;语句
}

FlatList的析构函数示例

FlatList::~FlatList() {
    Flat* current = Head;
    while (current != nullptr) {
        Flat* next = current->next_Flat;
        delete current; // 释放当前节点内存
        current = next;
    }
    Head = nullptr; // 清空Head,避免悬空指针
}

额外提醒

你原代码还有一个潜在崩溃点:当链表为空(Head是nullptr)时,调用add_flat(0, ...)会执行Head->prev_Flat = new_flat,直接触发空指针访问错误。上面的修正代码已经添加了if (Head != nullptr)的判断,必须保留。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 19:20:35