分配具有相同标识符的内存

时间:2011-09-15 05:41:47

标签: c

#include<stdio.h>
#include<stdlib.h>
int main()
{
    char *temp;
    while(1)
    {
        temp= malloc(sizeof(char)*10);
        /*some code*/
    }
}

我的问题是:我在每个循环中使用相同的名称分配内存。分配的先前内存会发生什么;当我们创建具有相同标识符的变量时,为什么我们没有收到任何错误?

PS:不要问我在这段代码中做了什么。我正在做一些其他的代码而错误地做了。只需重新修改它并询问我的问题。

5 个答案:

答案 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);
}