Valgrind检测到C++代码内存泄漏,寻求修复方案
修复C++代码中Valgrind检测到的内存泄漏问题
Valgrind检测到内存泄漏点指向Project *temp = new Project[numProjects + 1];,但你在分支内尝试delete[] temp等操作是错误的——这段函数内的temp最终已经赋值给成员变量projects,函数内释放它会导致悬空指针。真正的泄漏原因是Department类的析构函数未释放projects指向的动态数组:当Department对象销毁时,projects指向的堆内存没有被回收,从而触发泄漏。
修复方案一:手动管理内存(遵循三/五法则)
添加析构函数释放内存
在Department类中添加析构函数,负责释放projects指向的动态数组:Department::~Department() { delete[] projects; }处理拷贝操作(避免浅拷贝问题)
由于类内存在动态分配的内存,必须实现深拷贝的拷贝构造函数和拷贝赋值运算符,或者直接禁用拷贝操作:- 禁用拷贝(推荐,若不需要拷贝Department对象):
Department(const Department&) = delete; Department& operator=(const Department&) = delete; - 实现深拷贝:
Department::Department(const Department& other) { numProjects = other.numProjects; budget = other.budget; projects = new Project[numProjects]; for (int i = 0; i < numProjects; ++i) { projects[i] = other.projects[i]; } } Department& Department::operator=(const Department& other) { if (this != &other) { delete[] projects; // 先释放当前对象的内存 numProjects = other.numProjects; budget = other.budget; projects = new Project[numProjects]; for (int i = 0; i < numProjects; ++i) { projects[i] = other.projects[i]; } } return *this; }
- 禁用拷贝(推荐,若不需要拷贝Department对象):
修复方案二:使用标准库容器(彻底避免手动内存管理)
用std::vector<Project>替代手动动态分配的数组,容器会自动处理内存的分配与释放,从根源消除泄漏风险:
修改Department类成员:
#include <vector> class Department { // 替换原有的Project* projects和int numProjects std::vector<Project> projects; double budget; // ...其他成员 };简化addProject函数:
bool Department::addProject(Project &newProject) { bool valid = true; double totalCost = 0; for (const auto& proj : projects) { totalCost += proj.m_cost; } totalCost += newProject.m_cost; if (totalCost > budget) { valid = false; } else { projects.push_back(newProject); } return valid; }
这样既不需要手动new/delete,也不用考虑析构和拷贝的问题,代码更简洁安全。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

