c++ - calloc 比 malloc 好吗?

标签 c++ c malloc dynamic-memory-allocation calloc

我前几天刚刚了解了 C calloc() 函数。阅读了它的描述以及它与 malloc(12)的不同之处后,我认为作为非嵌入式程序员,我应该始终使用 calloc()。但事实真的如此吗?

我有一个保留意见是访问 calloc() 内存的额外延迟,但我也想知道是否存在从 malloc() 切换到calloc() 会以更严重的方式破坏程序。

P. S. calloc() 的零初始化方面对我来说非常清楚。我有兴趣了解的是 calloc()malloc() 之间的另一个区别 - calloc() 提供的惰性内存分配.如果您只关注内存初始化方面,请不要发布答案。

最佳答案

这确实是一个视情况而定的决定。经验法则是

  • 如果您首先写入分配的内存,malloc() 更好(可能的开销更少)。

    示例:考虑以下场景

    char * pointer = NULL;
    
    //allocation
    
    strcpy(pointer, source);
    

    在这里,使用malloc()可以很好地进行分配。

  • 如果有可能使用分配的内存进行先读后写,请使用 calloc(),因为它会初始化内存。通过这种方式,您可以避免调用 undefined behavior 的单元化内存先读后写场景的问题。 .

    例子:

    char * pointer = NULL;
    
    //allocation
    
    strcat(pointer, source);
    

    这里,strcat() 需要第一个参数已经是一个string,使用malloc() 分配不能保证这一点。由于 calloc() 对内存进行零初始化,它将在这里达到目的,因此,calloc() 是这种情况下的方法。

要详细说明第二种情况,请引用 C11,第 7.24.3.1 章(关注我的重点)

The strcat() function appends a copy of the string pointed to by s2 (including the terminating null character) to the end of the string pointed to by s1. The initial character of s2 overwrites the null character at the end of s1. [....]

因此,在这种情况下,目标指针应该是指向字符串的指针。通过 calloc() 进行分配保证了使用 malloc() 进行分配时不能保证,正如我们从第 §7.22.3.4 章中所知

The malloc function allocates space for an object whose size is specified by size and whose value is indeterminate.


编辑:

建议使用 malloc() 而不是 calloc() 的一种可能情况是编写用于单元/集成测试的测试 stub 。在这种情况下,使用 calloc() 可以隐藏与后一种情况类似的潜在错误。

关于c++ - calloc 比 malloc 好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41263448/

相关文章:

c++ - `char * const` 字段被 MSVC (VS2015) 视为 "incompatible with C"

c++ - 如何通过命令提示符在Windows上编译GLFW程序?

在 C 中将 int 转换为空格

C - 重新分配错误 : corrupted size vs prev_size

c++ - 程序终止后动态分配的内存

c++ - 数组类型无效

c++ - 数组大小作为构造函数参数

c - 使用 gcc 4.4.3 的 ubuntu 上的 gdb 问题

c - BMP{FileHeader, InfoHeader} 结构的问题

c - C中Malloc的使用及指针成员错误