【问题标题】:what will happen if we dont use free() for allocated memory [duplicate]如果我们不使用 free() 分配内存会发生什么
【发布时间】:2019-09-30 05:12:18
【问题描述】:

如果我使用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
}

【问题讨论】:

  • 从来没有那样使用malloc(我认为标准语法是*malloc(size_t size)。那样你就不能告诉程序在完全相同的位置分配内存。
  • 如果你不使用free(),你已经丢失了第一个malloc分配的内存,你无法访问。你基本上是在泄漏内存。也可以duplicate
  • MALLOC 是做什么的?

标签: c free dynamic-memory-allocation


【解决方案1】:

您正在使用一个非常奇怪的宏,标准 C 中的分配会这样写:

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

那么第二次分配就完成了,不调用free(),覆盖a的内容;这非常糟糕,因为它会泄漏内存。这就是为什么我在上面将其声明为* const,以表明不应覆盖典型使用中的指针变量,因为我们希望保留它的值。

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

调用free() 的需要主要是关于在您的程序运行时完成的分配,如果分配重复发生,则进程只会增长,否则会增长。

【讨论】:

    【解决方案2】:

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

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

    malloc,在这种情况下,返回一个指向'a'字节大小的块的指针,并且'a'被设置为等于那个大小。

    如果你这样做了,现在再来一次

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

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

    如果你真的想使用“malloc with the same pointer”,你可能对 realloc 函数感兴趣:

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

    【讨论】:

    • 我认为 OP 的问题是,如果在同一指针上再次分配之前不释放会发生什么。
    • @Pratik Sampat 这一点可以用“unwind”清楚地解释。有必要重写吗?在这里我试图纠正他的代码。
    • 是的,如果您还解释他在没有free 的同一指针上所做的两个mallocs 的影响,这可能是一个更清晰的答案,以便OP 可以理解为什么它错了不仅仅是这个错误,这是正确的做事方式。
    • @PratikSampat 根据您的建议,修改答案很累。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2012-01-13
    • 2020-07-14
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多