C++动态数组扩容时出现内存泄漏,求助排查修复
自定义ArrayList扩容内存泄漏排查与修复
问题根源
你的doubleCapacity函数存在核心逻辑错误:
- 错误调用
destroyList(List)销毁了传入的ArrayList结构体实例,导致List变为野指针(指向已释放的内存)。 - 后续对
List->size、List->capacity、List->items的赋值操作,都是在操作已回收的内存空间,属于未定义行为。 - 最终main函数中再次调用
destroyList(l),会对已释放的结构体指针执行二次delete,触发双重释放,同时valgrind会检测到内存泄漏。
修复后的扩容函数
正确的扩容逻辑只需要重新分配元素数组,不需要销毁整个结构体。修复后的代码如下:
// 扩容函数:仅重新分配items数组,保留原结构体实例 void doubleCapacity(ArrayList* List){ // 计算新容量并分配新数组 int new_capacity = List->capacity * 2; int* new_items = new int[new_capacity]; // 复制原数组的所有元素到新数组 for (int i = 0; i < List->size; ++i) { new_items[i] = List->items[i]; } // 释放原数组内存,避免泄漏 delete[] List->items; // 更新ArrayList的容量和数组指针 List->capacity = new_capacity; List->items = new_items; }
优化建议
- 使用标准库函数简化元素复制:
引入<algorithm>头文件后,可使用std::copy替代手动循环,代码更简洁可靠:#include <algorithm> void doubleCapacity(ArrayList* List){ int new_capacity = List->capacity * 2; int* new_items = new int[new_capacity]; std::copy(List->items, List->items + List->size, new_items); delete[] List->items; List->capacity = new_capacity; List->items = new_items; } - 优化结构体定义:
添加typedef简化类型声明,避免重复书写struct关键字:typedef struct ArrayList { int size; // 当前元素数量 int capacity; // 数组总容量 int* items; // 元素数组指针 } ArrayList;
内容的提问来源于stack exchange,提问作者FieldyScop
相关产品推荐
相关产品推荐

