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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 21:36:02