C++内存释放方法及add_flat函数delete后Head值异常问题求助
C++链表内存管理问题:添加节点后delete导致Head返回垃圾值
核心问题
你犯了基础的内存管理逻辑错误:刚用new创建节点并插入链表,立刻就用delete把它销毁了。
new Flat()在堆上分配内存,你将这个节点插入链表后,Head(或链表其他节点)已经指向这块内存。但随后的delete new_flat直接释放了该内存,此时链表中的指针变成悬空指针,访问它的成员(比如Head->id)必然得到垃圾值,这属于C++的未定义行为。
这和析构函数无关,你完全搞反了new/delete的使用场景:
new是用来创建需要长期存在的对象(比如链表节点,要留在链表中直到被移除)delete是当你彻底不再需要这个对象时,才去释放它占用的内存
修复步骤
- 删除
delete new_flat;语句:让新创建的节点留在链表中供后续使用。 - 给
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
相关产品推荐
相关产品推荐

