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

