#include<stdio.h>
#include<stdlib.h>
int main()
{
char *temp;
while(1)
{
temp= malloc(sizeof(char)*10);
/*some code*/
}
}
我的问题是:我在每个循环中使用相同的名称分配内存。分配的先前内存会发生什么;当我们创建具有相同标识符的变量时,为什么我们没有收到任何错误?
PS:不要问我在这段代码中做了什么。我正在做一些其他的代码而错误地做了。只需重新修改它并询问我的问题。
答案 0 :(得分:3)
它被称为memory leak。你无法释放记忆,所以你输了。
你的过程将继续增长,直到你的可用内存耗尽(或者,如果它是64位,将盒子交换为遗忘,此时你的本地系统管理员将会过来并打扰你。如果它是一台生产机器,你“你可能会发现你的老板和人力资源部门的绩效改进计划是什么。”
答案 1 :(得分:3)
分配的prev memory会发生什么。
将永远失去。这就是所谓的“ memory leak ”。
因为我们正在创建具有相同标识符的变量,为什么我们没有收到任何错误
这不是编译错误。编译器不遵循您的逻辑,只遵循您的语法。编译器可以完全覆盖值。
答案 2 :(得分:1)
分配的previos内存将被泄露,因为它没有被释放,其地址丢失到程序中。您没有收到任何错误,因为您没有创建具有相同标识符的变量,您正在分配不同的内存块并将指针存储到相同的临时变量中。
考虑阅读一些基本的C编程资料,因为您似乎将变量与内存混淆。
答案 3 :(得分:0)
在大多数情况下,编译器不会检测到逻辑错误,例如,程序员分配内存但从不释放它。
这就是我们所说的“内存泄漏”。
答案 4 :(得分:-1)
此处temp
是指针而非标识符
所以temp
指向我的malloc
分配的内存。
因此,当您分配新内存并使用SAME指针指向新分配的内存时,它不再指向旧分配的内存块,它将永远丢失。所以你有一个memory leak。
如果在循环的当前迭代结束后不再需要temp指向的内存,请改用以下代码。
#include<stdio.h>
#include<stdlib.h>
int main()
{
char *temp;
while(1)
{
temp= malloc(sizeof(char)*10);
/*some code*/
/* free the memory pointed by temp */
free(temp);
}
}
这样就没有内存泄漏,因为在下一个循环开始时分配新块之前,迭代结束时释放了指向temp的内存。
<强>更新强>
您也可以在整个循环中使用temp指向的相同内存块。无需在每次迭代中重新分配
如果您不想保留任何旧记忆,只需使用memset
,就像这样
#include<stdio.h>
#include<stdlib.h>
int main()
{
/* allocate memopry only once */
char *temp = malloc(sizeof(char)*10);
while(1){
/* zero out the memory so no old data is left */
memset((void*)temp, 0, sizeof(char)*10);
/* some code that uses temp */
}
/* free the allocated memory */
free(temp);
}