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

C++ SongCollection类内存泄漏问题排查与修复方案咨询

问题根因

  • 构造函数循环内共分配了19块Song类型的动态内存,所有内存的指针都存入了collection容器,仅最后一块的指针同时赋值给了类成员m_storage
  • 析构函数仅释放了m_storage指向的最后1块内存,剩余18块存在collection里的动态内存完全没有释放
  • std::vector::clear()仅会清空容器内存储的指针值,不会自动释放指针指向的堆内存,无法起到内存回收作用

修复方案

第一步:修改析构函数,遍历释放所有容器内存储的动态内存

SongCollection::~SongCollection() {
    // 遍历容器释放所有Song对象的堆内存
    for (Song* song : collection) {
        delete song;
    }
    // 清空容器内的空指针
    collection.clear();
    // m_storage已经随容器遍历被释放,直接置空即可
    m_storage = nullptr;
}

附加优化建议

  • 去掉冗余的类成员m_storage,直接在循环内部定义局部Song*变量分配内存后存入容器即可,避免重复维护指针引发错误
  • 构造函数中打开文件的逻辑存在bug:当前硬编码打开固定文件songs.txt,未使用传入的filename参数,和异常抛出时的提示逻辑不匹配
  • 更安全的实现方案是将容器改为std::vector<std::unique_ptr<Song>>类型,不需要手动管理内存,对象生命周期结束后会自动回收堆内存,从根源避免内存泄漏问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 03:54:03