C中的内存泄漏是什么?

时间:2015-05-26 18:23:35

标签: c memory-leaks

我尝试解决exercise 16的额外功劳,尽管它正确编译,但我发现了内存泄漏。
现在我的想法是,如果根本不使用malloc,程序就不会泄漏内存,但是这样做,因为当我运行命令时:

  • valgrind --leak-check=full -v ./ex16-1
    我得到了:

  • definitely lost: 21 bytes in 2 blocks

    • 所以现在我想问一下即使不分配任何内存也可能有泄漏(假设我的来源没有问题)?
    • 此外,如果可能,那么我如何释放该内存块?
      记忆指向何处?
      PS: valgrind的完整输出可在此处获得:Pastebin-1
      这里的来源是:Pastebin-2

2 个答案:

答案 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()或任何相关函数的情况,但它会报告已分配的内存并可能释放内存给您。