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

Valgrind检测到C++代码内存泄漏,寻求修复方案

修复C++代码中Valgrind检测到的内存泄漏问题

Valgrind检测到内存泄漏点指向Project *temp = new Project[numProjects + 1];,但你在分支内尝试delete[] temp等操作是错误的——这段函数内的temp最终已经赋值给成员变量projects,函数内释放它会导致悬空指针。真正的泄漏原因是Department类的析构函数未释放projects指向的动态数组:当Department对象销毁时,projects指向的堆内存没有被回收,从而触发泄漏。

修复方案一:手动管理内存(遵循三/五法则)

  1. 添加析构函数释放内存
    在Department类中添加析构函数,负责释放projects指向的动态数组:

    Department::~Department() {
        delete[] projects;
    }
    
  2. 处理拷贝操作(避免浅拷贝问题)
    由于类内存在动态分配的内存,必须实现深拷贝的拷贝构造函数和拷贝赋值运算符,或者直接禁用拷贝操作:

    • 禁用拷贝(推荐,若不需要拷贝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;
      }
      

修复方案二:使用标准库容器(彻底避免手动内存管理)

用std::vector<Project>替代手动动态分配的数组,容器会自动处理内存的分配与释放,从根源消除泄漏风险:

  1. 修改Department类成员:

    #include <vector>
    
    class Department {
        // 替换原有的Project* projects和int numProjects
        std::vector<Project> projects;
        double budget;
        // ...其他成员
    };
    
  2. 简化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 12:15:33