C使用Valgrind解决内存泄漏
因此,我有php、ruby和python的背景,并开始使用C。我使用Valgrind检查我的程序是否没有做傻事,但我经常得到这种输出:C使用Valgrind解决内存泄漏,c,memory-leaks,valgrind,C,Memory Leaks,Valgrind,因此,我有php、ruby和python的背景,并开始使用C。我使用Valgrind检查我的程序是否没有做傻事,但我经常得到这种输出: 14072== <...VALGRIND HEADER & COPYRIGHT...> 14158== HEAP SUMMARY: 14158== in use at exit: 137,084 bytes in 196 blocks 14158== total heap usage: 247 allocs, 51 frees,
14072== <...VALGRIND HEADER & COPYRIGHT...>
14158== HEAP SUMMARY:
14158== in use at exit: 137,084 bytes in 196 blocks
14158== total heap usage: 247 allocs, 51 frees, 149,496 bytes allocated
14158==
14158== 7 bytes in 1 blocks are definitely lost in loss record 3 of 74 at
14158== 0x4C2745D: malloc in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so
14158== by 0x50F3369: strdup in /usr/lib64/libc-2.18.so
14158== by 0x4E51B34: readline in /usr/lib64/libedit.so.0.0.43
14158== by 0x40083C: main in /home/<program location>/
14158==
14158== LEAK SUMMARY:
14158== definitely lost: 7 bytes in 1 blocks
14158== indirectly lost: 0 bytes in 0 blocks
14158== possibly lost: 0 bytes in 0 blocks
14158== still reachable: 137,077 bytes in 195 blocks
14158== suppressed: 0 bytes in 0 blocks
14158== Reachable blocks (those to which a pointer was found) are not shown.
14158== To see them, rerun with: --leak-check=full --show-leak-kinds=all
14158==
14158== For counts of detected and suppressed errors, rerun with: -v
14158== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 2 from 2)
我已经尝试在函数main返回值之前释放prompt
和cmd_exit
变量,但根据Valgrind,泄漏仍然存在
...
free(prompt);
free(cmd_exit);
return 0;
}
一些问题:
- 如何消除报告的内存泄漏
- 在这种情况下我应该使用静态变量吗
- 我也应该释放这些静态变量吗
欢迎提供任何好的建议或材料。您只需要
释放您malloc
ed的内容,因此不需要释放静态变量
由于readline函数似乎使用strdup,并且使用malloc/calloc,因此需要释放输入。在循环中执行此操作是很好的,但在退出循环时没有执行此操作:
if(strcmp(input,cmd_exit) == 0) {
puts("Bye!");
free(input);
return 0;
}
顺便说一下:
static char prompt[6] = "repl>";
文本“repl>”有6个字符,r、e、p、l和一个nul字节来标记字符串的结尾。您只需要释放您malloc
编辑的内容,因此不需要释放静态变量
由于readline函数似乎使用strdup,并且使用malloc/calloc,因此需要释放输入。在循环中执行此操作是很好的,但在退出循环时没有执行此操作:
if(strcmp(input,cmd_exit) == 0) {
puts("Bye!");
free(input);
return 0;
}
顺便说一下:
static char prompt[6] = "repl>";
文本“repl>”有6个字符,r,e,p,l,>和一个nul字节来标记字符串的结尾。如果(strcmp(input,cmd_exit)==0){puts(“Bye!”;return 0;}则在返回之前释放输入。您不需要释放提示符
或cmd u exit
。如果在终止时,readline()
分配了input
,则可能需要释放它。你能给我们看一下这个函数吗。@Rohan readline函数是用这个标题导入的#include
在返回前自由输入的,如果(strcmp(input,cmd_exit)==0{put(“Bye!”);return 0;},你不需要释放提示符
或cmd u exit
。如果在终止时,readline()
分配了input
,则可能需要释放它。你能给我们看一下这个函数吗。@Rohan readline函数是用这个标题导入的#include
谢谢!这让我想到了一种更易于维护的释放内存的方法。在多个地方释放同一个变量看起来不太好。我也不知道空字节分配,答案是+1。谢谢!这让我想到了一种更易于维护的释放内存的方法。在多个地方释放同一个变量看起来不太好。我也不知道空字节分配,答案是+1。