我尝试解决exercise 16的额外功劳,尽管它正确编译,但我发现了内存泄漏。
现在我的想法是,如果根本不使用malloc,程序就不会泄漏内存,但是这样做,因为当我运行命令时:
valgrind --leak-check=full -v ./ex16-1
我得到了:
definitely lost: 21 bytes in 2 blocks
答案 0 :(得分:3)
此程序演示了严重的内存泄漏。在许多系统上,它不会运行得很远。
#include <memory.h>
int add (int a, int b)
{
char *hog = malloc (1024 * 1024 * 1024 * 50);
return a + b;
}
int main (void)
{
int sum = add (add (6, 8), add (3, 7));
return 0;
}
如果是您的计划,则会调用strdup()
来调用malloc
。当你完成strdup的返回值时,它应该被释放。
答案 1 :(得分:2)
当您动态分配内存时,您有责任释放分配的内存,即将其返回给操作系统,因此如果您无法释放内存,它可以重复使用事实证明,它足够的内存,你的系统可能会耗尽内存,导致所有正在运行的程序失败,新的程序将无法启动。
如果你不使用malloc()
,但是你使用的是某个库或标准库函数,那么就会发生泄漏,一种方法是
void function()
{
FILE *file;
file = fopen("/some/path/file.txt", "r");
/* check that file is valid and use it */
}
上面的函数泄漏了内存,因为fopen()
分配的某些资源没有被释放,你需要fclose(file)
来防止泄漏。
使用valgrind您可能会发现代码中没有明显调用malloc()
或任何相关函数的情况,但它会报告已分配的内存并可能释放内存给您。