在 CI 中,如果您从未使用过或使用malloc()
过,则可以通过使用偶尔分配包含一些垃圾数据的内存。memset()
calloc()
拾取垃圾数据的频率如何?
有没有一种安全的方法可以避免这种情况而不必使用calloc()
或memset()
每次都使用?
您必须始终担心拾取“垃圾数据”并将分配的内存初始化为程序中有意义的东西。
没有保证通过 malloc 分配的内存将初始化为给定值。
你应该确保你的构造函数初始化变量,并且你 memset 分配的内存是一个合理的值。
该malloc()
函数基本上从两个不同的地方获取内存:
它直接从操作系统(内核)请求内存。在 Linux 和 OS X 等 Unix 系统上,这是通过mmap()
orsbrk()
系统调用完成的。内核中的内存一开始总是零初始化。
它重用之前使用free()
. 这总是被假定为充满垃圾。
只需使用calloc()
. 该calloc()
函数知道内存来自哪个池。如果它来自操作系统,那么它已经被零初始化,你可以免费获得零内存。如果内存来自free()
,那么calloc()
将为您将其归零。查看为什么 malloc+memset 比 calloc 慢以获得更多详细信息。
懒人总结:该calloc()
函数已经执行了您正在考虑的优化。
有没有一种安全的方法可以避免这种情况,而不必每次都使用 calloc() 或 memset() ?
至少在 Windows 中有。直接调用VirtualAlloc()
:
VirtualAlloc 函数 (Windows)
在调用进程的虚拟地址空间中保留或提交页面区域。除非指定了 MEM_RESET,否则此函数分配的内存会自动初始化为零。