我有一个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();
}
以上程序是否在无限递归中?到底会发生什么?考虑到我拥有的资源,这个程序何时崩溃/死亡?
答案 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;
}
现在关于你的节目。
这个程序将永远不会结束并永远调用x(因此打印Hello World!直到时间结束)
#include <stdio.h>
void x(void) {
printf("Hello World!\n");
}
int main(int argc, char *argv[]) {
while (1) x();
return 0;
}
这个程序为每个循环分配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;
}
该程序不断递归,直到堆栈耗尽(堆栈跟踪)并且程序将崩溃(堆栈溢出)。
void x(void) {
x();
}
int main(int argc, char *argv[]) {
x();
return 0;
}
答案 1 :(得分:3)
第一个程序没有内存泄漏,它将永远运行(或直到它从外部被杀死),愉快地打印该字符串。
第二次 内存泄漏但它不会崩溃。您只需从NULL
开始获取malloc
。否则,与上面的数字1相同。
第三个将最终溢出堆栈,除非你的编译器中有一些特别好的尾端递归优化,在这种情况下它也会永远运行。
顺便说一句,那段代码特别糟糕。由于默认返回类型和main
函数没有两个规范参数列表是可以接受的,所以已经很长时间了。
答案 2 :(得分:2)