【发布时间】: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