内存泄漏 - 它们何时发生?
我有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我有吗?
没有在第一个程序没有内存泄漏,它会永远运行(或直到它从外面杀死),高兴地打印该字符串。
还有是第二次内存泄漏但不会崩溃。你只需从malloc
开始获得NULL
。否则,与上面的数字1相同的效果。
第三个最终会溢出堆栈,除非在编译器中有一些特别好的尾端递归优化,在这种情况下它也会永远运行。
顺便说一下,该代码特别糟糕。自从默认返回类型和没有两个规范参数列表的函数都可以接受以来,这已经很长时间了。
- 无内存泄漏。该计划将永不停止。
- 这是内存泄漏。在程序工作中,您正在分配内存,但在下一步之后,您没有任何指向要删除的内存的指针。当内存完成时,这会引发“坏分配”错误。
- 在这里你没有内存泄漏,但是当堆栈的内存完成时程序会崩溃。
这就是我的问题!!!我有一个8GB的RAM!什么时候会崩溃? – Vijay 2011-03-23 10:09:52
恰恰相反,OP在怀疑。 2)不会崩溃 – 2011-03-23 10:10:35
@ zombie 3)取决于堆栈的大小。内存大小无关紧要。 – 2011-03-23 10:11:22
当您使用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;
}
其实你的坏榜样并没有那么糟糕。当程序结束时,无论程序是否明确释放它们,这些字节都将被释放。内存泄漏只是程序继续运行时的一个问题。当它终止时,操作系统回收分配给它的所有内存。 – aroth 2011-03-23 10:17:27
@aroth:取决于操作系统,不受C标准的保证。 – orlp 2011-03-23 10:18:56
C标准所说的不应该是什么(并且C标准不应该对程序终止时操作系统所做的任何事情做出保证)。 OS处理可执行代码,并且无法知道程序X是用C编写的。如果操作系统在程序终止后留下任何驻留在内存中的东西,那么这是操作系统中的一个bug,并且与任何程序做了或没有做。 – aroth 2011-03-23 10:22:50
我有一个问题给你。当你尝试这些程序时会发生什么?多久时间? – 2011-03-23 10:03:45
这些是三个不同的(相关问题),其中一些是无法解析的(特别是2取决于您的配置,操作系统位数,甚至编译器选项)。甚至更多的是,在答案中实际上几乎没有任何价值...... – 2011-03-23 10:04:05
如果没有正确的缩进,代码就接近“难以阅读”。 – Vatine 2011-03-23 10:04:31