2011-03-23 215 views
0

我有8GB的RAM和我有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 
} 

its obvious that this program will crash after some time but i want to know when looking at the resources i mentioned above. 

3)

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

这上面的程序是无限递归?到底会发生什么时,这会程序崩溃/死机考虑resouces我有吗?

+1

我有一个问题给你。当你尝试这些程序时会发生什么?多久时间? – 2011-03-23 10:03:45

+0

这些是三个不同的(相关问题),其中一些是无法解析的(特别是2取决于您的配置,操作系统位数,甚至编译器选项)。甚至更多的是,在答案中实际上几乎没有任何价值...... – 2011-03-23 10:04:05

+2

如果没有正确的缩进,代码就接近“难以阅读”。 – Vatine 2011-03-23 10:04:31

回答

3

没有在第一个程序没有内存泄漏,它会永远运行(或直到它从外面杀死),高兴地打印该字符串。

还有第二次内存泄漏但不会崩溃。你只需从malloc开始获得NULL。否则,与上面的数字1相同的效果。

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

顺便说一下,该代码特别糟糕。自从默认返回类型和没有两个规范参数列表的函数都可以接受以来,这已经很长时间了。

+0

你提到的这一点很有趣!“第二个内存泄漏,但不会崩溃”。这是真的吗?第二个程序不会崩溃? – Vijay 2011-03-23 10:14:39

+0

+1为唯一完全正确的答案 – 2011-03-23 10:15:12

+0

@ zombie,这是正确的,它不会崩溃。所有将发生的事情是,你会耗尽堆并开始回NULL。现在,如果你试图去记住那个记忆,那将是另一回事。 – paxdiablo 2011-03-23 11:35:48

2
  1. 无内存泄漏。该计划将永不停止。
  2. 这是内存泄漏。在程序工作中,您正在分配内存,但在下一步之后,您没有任何指向要删除的内存的指针。当内存完成时,这会引发“坏分配”错误。
  3. 在这里你没有内存泄漏,但是当堆栈的内存完成时程序会崩溃。
+0

这就是我的问题!!!我有一个8GB的RAM!什么时候会崩溃? – Vijay 2011-03-23 10:09:52

+0

恰恰相反,OP在怀疑。 2)不会崩溃 – 2011-03-23 10:10:35

+0

@ zombie 3)取决于堆栈的大小。内存大小无关紧要。 – 2011-03-23 10:11:22

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; 
} 
+0

其实你的坏榜样并没有那么糟糕。当程序结束时,无论程序是否明确释放它们,这些字节都将被释放。内存泄漏只是程序继续运行时的一个问题。当它终止时,操作系统回收分配给它的所有内存。 – aroth 2011-03-23 10:17:27

+0

@aroth:取决于操作系统,不受C标准的保证。 – orlp 2011-03-23 10:18:56

+1

C标准所说的不应该是什么(并且C标准不应该对程序终止时操作系统所做的任何事情做出保证)。 OS处理可执行代码,并且无法知道程序X是用C编写的。如果操作系统在程序终止后留下任何驻留在内存中的东西,那么这是操作系统中的一个bug,并且与任何程序做了或没有做。 – aroth 2011-03-23 10:22:50