1

在 CI 中,如果您从未使用过或使用malloc()过,则可以通过使用偶尔分配包含一些垃圾数据的内存。memset()calloc()

拾取垃圾数据的频率如何?

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

4

4 回答 4

5

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

于 2013-02-22T04:51:04.400 回答
3

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

你应该确保你的构造函数初始化变量,并且你 memset 分配的内存是一个合理的值。

于 2013-02-22T04:49:59.687 回答
3

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

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

  2. 它重用之前使用free(). 这总是被假定为充满垃圾。

只需使用calloc(). 该calloc()函数知道内存来自哪个池。如果它来自操作系统,那么它已经被零初始化,你可以免费获得零内存。如果内存来自free(),那么calloc()将为您将其归零。查看为什么 malloc+memset 比 calloc 慢以获得更多详细信息。

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

于 2013-02-22T05:19:59.560 回答
0

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

至少在 Windows 中有。直接调用VirtualAlloc()

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

于 2013-02-22T06:14:20.863 回答