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,

因此,我有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, 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。