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
相关产品推荐
相关产品推荐

