如果我们不对分配的内存使用free()将会发生什么

时间:2019-05-13 09:04:34

标签: c free dynamic-memory-allocation

如果我使用malloc()分配内存,而不使用free()取消分配内存, 记忆。为什么仅仅通过覆盖先前的内容就不能被其他程序访问

void main()
{
    int *a;            //here a is holding a junk value

    MALLOC(a,1,int);
    *a=100;            //a is holding 100

    MALLOC(a,1,int);
    *a=200;            //a is holding 200 

    /* so memory location where the value 100 is stored is inaccessible
       cannot be reused */
    //why can't we just over write that memory space when used next time
}

2 个答案:

答案 0 :(得分:2)

您使用的是一个非常奇怪的宏,标准C中的分配为:

int * const a = malloc(sizeof *a);
if (a != NULL)
{
  *a = 100;
}

然后完成第二个分配,而无需调用free(),并覆盖a的内容;这非常糟糕,因为它会泄漏内存。这就是为什么我在上面将其声明为* const的原因,以表示通常不应使用指针变量,因为我们要保留其值。

当程序结束时,在典型的现代系统上,该进程使用的所有资源将被操作系统回收,并且内存将用于其他用途。

调用free()的需要主要是关于程序运行时 完成的分配,如果重复发生分配,则该过程只会越来越多。

答案 1 :(得分:-1)

Malloc返回一个指向已分配内存块的指针。

int *a;
a= (int *) malloc(sizeof *a);
在这种情况下,

malloc返回一个指向大小为“ a”个字节的块的指针,并且将“ a”设置为等于该大小。

现在就再做一次

a= (int *) malloc(sizeof *a);

您不是在同一指针上使用malloc。您正在调用malloc()(分配空间并返回指向该空间的指针),并将其返回值分配给同一指针对象。

如果您实际上想使用带有相同指针的malloc,您可能会对realloc函数感兴趣:

int *a;
a = malloc(sizeof *a);
a = realloc(a, 10 * sizeof(a));