【问题标题】:Is it possible for malloc(), called just after free() to return pointer pointing to same freed memory?是否有可能在 free() 之后调用 malloc() 返回指向相同释放内存的指针?
【发布时间】:2015-08-05 02:32:58
【问题描述】:

我正在编写一个在 while(1) 中持续运行并等待中断(基本上是 RING)来解码消息的应用程序。所以当我成功解码消息时,我只需要打印它并开始等待另一个中断(一条新消息)。

我想在开始新消息之前清除所有数据结构。所以我只是释放指针并将它们返回。但是当我这样做时,数据结构中仍有一些字段包含旧数据。所以我只是使用 calloc() 将所有内存清零以清除旧数据。

我知道调用 free 释放的内存不会立即返回给操作系统,它仍然位于空闲内存池中,但 malloc 是否有可能返回相同的释放内存?

if(res){                               // If decoded successfully
        display_CID_info(cs, cs_data); // Display CallerID message
        free(cs);                      // Free the CID data structure
        free(cs_data);                 // Free message data structure

        /* Allocate Data structures again for next iteration */
        cs_data = malloc(sizeof(cid_data));
        cs = calloc(1, sizeof(*cid));
    }

【问题讨论】:

  • 当然,为什么不呢?如果您想清除内存,请自行 memset(),或使用 calloc()。 free() 释放的内存根本不会返回给操作系统,而是被池化的。
  • 您在malloced 数据结构中检测到旧数据这一事实表明,您在写入之前就读取它做错了。
  • C题不要加C++标签!
  • 有什么问题?无论如何,您都必须初始化动态内存,因为malloc 不能保证将其归零。
  • 要明确一点,因为没有人明确说过:在任何情况下,都不能依赖 malloc() 返回与 free()d 相同的内存。那将是未定义的行为,并会招致可怕的错误。

标签: c operating-system


【解决方案1】:

是的,这是完全可能的。当您调用 free 时,内存管理器会将那部分内存标记为片段,可能会将其与相邻片段组合,但不会将数据设置为全零。 malloc() 函数也不会将所有数据都设置为零。

例如,如果在您的程序中第一次调用free(),然后立即调用malloc() 以获得相等或更少的内存量,则内存管理器完全有可能重用旧片段.

【讨论】:

  • 我认为它是一个打开和关闭的案例!谢谢!
  • 值得澄清的是,这在实践中很可能发生,并且标准允许这样做,但这是特定于实现的行为。
猜你喜欢
  • 1970-01-01
  • 2011-10-28
  • 2017-01-06
  • 2011-11-15
  • 1970-01-01
  • 2014-11-28
  • 2020-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多