内存泄漏:什么时候发生?

时间:2011-03-23 10:01:39

标签: c++ c

我有一个8GB的内存,我有80GB的硬盘。 我有三个程序,如下所示。

1)

main()
{

  while(1)
     x();
}

x()
{
  printf("hello\n");
}

上述程序中是否会出现内存泄漏?我想不是。如果没有发生那么会发生什么?什么时候会停止?

2)

main()
{
   int *x;
   while(1)
      x=malloc(100*size(int));//there is a memory leak here
}

很明显,这个程序会在一段时间后崩溃,但我想知道 WHEN ,看看我上面提到的资源。

3)

main()
{
   x();
}
x()
{
   x();
}

以上程序是否在无限递归中?到底会发生什么?考虑到我拥有的资源,这个程序何时崩溃/死亡?

3 个答案:

答案 0 :(得分:3)

当您使用malloc()请求内存且不free()内存时,会发生内存泄漏。

错误示例

#include <stdlib.h>

int main(int argc, char *argv[]) {
    int *nums = malloc(10 * sizeof(int)); // create array with memory for 10 nums
    nums[0] = 2;
    nums[4] = 8;

    return 0; // main() ended but nums wasn't free'd. Memory leak/
}

好例子

#include <stdlib.h>

int main(int argc, char *argv[]) {
    int *nums = malloc(10 * sizeof(int)); // create array with memory for 10 nums
    nums[0] = 2;
    nums[4] = 8;

    free(nums); // free memory allocated for nums

    return 0;
}

现在关于你的节目。

1 - 重新格式化

这个程序将永远不会结束并永远调用x(因此打印Hello World!直到时间结束)

#include <stdio.h>

void x(void) {
    printf("Hello World!\n");
}

int main(int argc, char *argv[]) {
    while (1) x();
    return 0;
}

2 - 重新格式化

这个程序为每个循环分配100个整数的内存,但从不释放这个内存。巨大的内存泄漏一直持续到操作系统内存不足。

#include <stdlib.h>

int main(int argc, char *argv[]) {
    int *x;
    while (1) {
        x = malloc(100 * size(int)); // allocate memory for an array of 100 integers
    }

    return 0;
}

3 - 重新格式化

该程序不断递归,直到堆栈耗尽(堆栈跟踪)并且程序将崩溃(堆栈溢出)。

void x(void) {
    x();
}

int main(int argc, char *argv[]) {
    x();

    return 0;
}

答案 1 :(得分:3)

第一个程序没有内存泄漏,它将永远运行(或直到它从外部被杀死),愉快地打印该字符串。

第二次 内存泄漏但它不会崩溃。您只需从NULL开始获取malloc。否则,与上面的数字1相同。

第三个将最终溢出堆栈,除非你的编译器中有一些特别好的尾端递归优化,在这种情况下它也会永远运行。

顺便说一句,那段代码特别糟糕。由于默认返回类型和main函数没有两个规范参数列表是可以接受的,所以已经很长时间了。

答案 2 :(得分:2)

  1. 没有内存泄漏。该计划永远不会停止。
  2. 这是内存泄漏。在程序工作期间,您正在分配内存,但在下一步之后,您没有任何指向此内存的指针要删除。当内存完成时,这将抛出“bad alloc”错误。
  3. 这里没有内存泄漏,但是当堆栈内存完成时程序会崩溃。