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

为何Valgrind检测出该C++函数存在内存泄漏?求解决办法

动态数组内存泄漏问题分析与解决

问题背景

动态分配int数组后,尝试在创建数组的同一函数中释放堆内存,但Valgrind提示程序退出时有20字节确定丢失,错误指向whoStarts函数的内存分配操作。

问题代码

int whoStarts(Parent* parents, int num){
    int* connects =  new int[num];
    for(int i = 0; i < num; i++){
        connects[i] = 0;
    }

    for(int i = 0; i < num;i++){
        for(int j = 0; j < num; j++){
            if(parents[i].name == parents[j].connectedName){
                connects[i]++;
            }
        }
    }

    for (int i = 0;i < num;i++){
        if(connects[i] == 0){
            return i;
        }
    }

    delete [] connects;

    return 0;
}

泄漏根源

第三个for循环中的return i;语句会直接终止函数:当找到第一个满足connects[i] == 0的元素时,函数立即返回,跳过了后续的delete [] connects;操作,导致动态分配的数组内存永远无法被释放,从而触发内存泄漏。

解决方案

方案1:手动提前释放内存

在return i;前先执行内存释放操作,保证所有分支路径都能释放内存:

for (int i = 0;i < num;i++){
    if(connects[i] == 0){
        delete [] connects; // 先释放内存再返回
        return i;
    }
}

delete [] connects;
return 0;

方案2:用智能容器自动管理内存

推荐使用C++标准库的std::vector替代手动动态数组,它会在生命周期结束时(包括函数提前return的场景)自动释放内存,彻底避免手动管理的疏漏:

#include <vector>

int whoStarts(Parent* parents, int num){
    std::vector<int> connects(num, 0); // 自动初始化所有元素为0,无需手动循环

    for(int i = 0; i < num;i++){
        for(int j = 0; j < num; j++){
            if(parents[i].name == parents[j].connectedName){
                connects[i]++;
            }
        }
    }

    for (int i = 0;i < num;i++){
        if(connects[i] == 0){
            return i;
        }
    }

    return 0;
}

Valgrind错误解释

给出的错误信息明确指向whoStarts函数中new int[num]分配的内存未被释放:

==820297== 20 bytes in 1 blocks are definitely lost in loss record 1 of 1
==820297==    at 0x4C38B6F: operator new[](unsigned long) (vg_replace_malloc.c:640)
==820297==    by 0x402254: whoStarts(Parent*, int) (phone_tree.cpp:114)
==820297==    by 0x401C39: main (phone_tree.cpp:38)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 04:27:09