从 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() 中提取垃圾数据的频率如何[重复]的主要内容,如果未能解决你的问题,请参考以下文章