从 malloc() 中提取垃圾数据的频率如何[重复]

Posted

技术标签:

【中文标题】从 malloc() 中提取垃圾数据的频率如何[重复]【英文标题】:How often does picking up junk data from malloc() occur [duplicate] 【发布时间】:2013-02-22 04:47:54 【问题描述】:

在 C 语言中,我知道通过使用 malloc(),如果您从未使用过 memset() 或改用 calloc(),您偶尔会分配包含一些垃圾数据的内存。

收集垃圾数据的频率如何?

有没有一种安全的方法可以避免这种情况,而不必每次都使用calloc()memset()

【问题讨论】:

未初始化内存未初始化。总是。 没有安全的方法。 【参考方案1】:

您必须始终担心拾取“垃圾数据”并将分配的内存初始化为程序中有意义的东西。

【讨论】:

【参考方案2】:

没有保证通过 malloc 分配的内存将被初始化为给定值。

您应该确保您的构造函数初始化变量,并将分配的内存设置为一个合理的值。

【讨论】:

【参考方案3】:

malloc() 函数基本上从两个不同的地方获取内存:

    它直接从操作系统(内核)请求内存。在 Linux 和 OS X 等 Unix 系统上,这是通过 mmap()sbrk() 系统调用完成的。内核中的内存一开始总是零初始化。

    它重用之前使用free() 释放的内存。这总是被假定为充满垃圾。

只需使用calloc()calloc() 函数知道内存来自哪个池。如果它来自操作系统,那么它已经被零初始化,你可以免费获得零内存。如果内存来自free(),那么calloc() 将为您将其归零。详情请见why malloc+memset is slower than calloc。

懒人总结:calloc() 函数已经执行了您正在考虑的优化。

【讨论】:

【参考方案4】:

有没有一种安全的方法可以避免这种情况,而不必每次都使用 calloc() 或 memset()?

至少在 Windows 中是这样。直接拨打VirtualAlloc()

VirtualAlloc 函数 (Windows) 在调用进程的虚拟地址空间中保留或提交页面区域。除非指定了 MEM_RESET,否则此函数分配的内存会自动初始化为零。

【讨论】:

以上是关于从 malloc() 中提取垃圾数据的频率如何[重复]的主要内容,如果未能解决你的问题,请参考以下文章

从C和C++内存管理来谈谈JVM的垃圾回收算法设计-上

从C和C++内存管理来谈谈JVM的垃圾回收算法设计-上

从标题中提取特征的垃圾邮件分类

如何使用 python 从 flickr xml 图像数据中提取图像地理数据?

从音频文件中提取音高特征

从多维 FFT 中提取频率