从malloc()中获取垃圾数据的频率是多少次

时间:2013-02-22 04:47:55

标签: c memory malloc

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

拾取垃圾数据的频率是多少?

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

4 个答案:

答案 0 :(得分:5)

你必须始终担心拿起“垃圾数据”并将分配的内存初始化为程序中有意义的内容。

答案 1 :(得分:3)

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

您应确保构造函数初始化变量,并将已分配的内存存储为合理的值。

答案 2 :(得分:3)

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

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

  2. 它重用之前使用free()释放的内存。这总是被认为是垃圾。

  3. 只需使用calloc()即可。 calloc()函数知道内存来自哪个池。如果它来自操作系统,那么它已经零初始化,你可以免费获得零内存。如果内存来自free(),则calloc()将为您归零。有关详细信息,请参阅why malloc+memset is slower than calloc

    懒惰的摘要: calloc()函数已经执行了您正在考虑的优化。

答案 3 :(得分:0)

  

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

至少在Windows中有。直接致电VirtualAlloc()

  

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