在C中,我理解通过使用malloc()
,如果您从未使用memset()
或使用calloc()
,则偶尔可以分配包含一些垃圾数据的内存。
拾取垃圾数据的频率是多少?
有没有一种安全的方法可以避免这种情况,而不必每次都使用calloc()
或memset()
?
答案 0 :(得分:5)
你必须始终担心拿起“垃圾数据”并将分配的内存初始化为程序中有意义的内容。
答案 1 :(得分:3)
没有承诺通过malloc分配的内存将被初始化为给定值。
您应确保构造函数初始化变量,并将已分配的内存存储为合理的值。
答案 2 :(得分:3)
malloc()
函数基本上从两个不同的地方获取内存:
它直接从操作系统(内核)请求内存。在Linux和OS X等Unix系统上,这是通过mmap()
或sbrk()
系统调用完成的。内核中的内存始终为零初始化。
它重用之前使用free()
释放的内存。这总是被认为是垃圾。
只需使用calloc()
即可。 calloc()
函数知道内存来自哪个池。如果它来自操作系统,那么它已经零初始化,你可以免费获得零内存。如果内存来自free()
,则calloc()
将为您归零。有关详细信息,请参阅why malloc+memset is slower than calloc。
懒惰的摘要: calloc()
函数已经执行了您正在考虑的优化。
答案 3 :(得分:0)
有没有一种安全的方法可以避免这种情况而不必每次都使用calloc()或memset()?
至少在Windows中有。直接致电VirtualAlloc()
:
VirtualAlloc功能(Windows)
在调用进程的虚拟地址空间中保留或提交页面区域。除非指定了MEM_RESET,否则此函数分配的内存将自动初始化为零。