这可能是一个简单的问题,但我找不到答案。在realloc和calloc内部是否会调用malloc?由于我在某种程度上正在计算malloc调用次数,因此这对我很有趣。谢谢。
在 IT 技术中,你不应该依赖于系统、库或编译器特定的机制。即使你知道 realloc 在某个系统/编译器/库上会调用 malloc,你也不能确保在其他系统上它会以相同的方式处理。
那么问题来了,你想要实现什么目标?如果你需要跟踪内存使用情况,在 C++ 中有更好的方法,例如安装一个全局替换操作符 new 和 delete。在某些 Linux 版本中,你还可以添加 malloc 钩子(我从未使用过这个功能)。在其他系统上,你可以使用其他机制更安全地实现你需要的功能。
如果您正在使用Linux,则可能正在使用glibc。您可以查看glibc malloc源代码,并查看它从诸如calloc之类的函数中调用了称为__malloc_hook的东西。这是一个记录在案的功能,可用于拦截和计算分配次数。您可以从mallinfo获取其他有用的统计信息。但是请先查看是否有现有工具可以实现您想要的功能。内存管理调试和统计是常见的需求!
你可以编写一个简单的测试程序,调用realloc和calloc,并将其输入到Valgrind工具中的callgrind。它会显示调用图,这样你就可以检查malloc和calloc在你的libc实现中调用了哪些函数。
从语言标准上来看,我们并不清楚。C99对函数之间的调用与否没有做出任何规定。
C++只是说malloc
不能调用new
,但对这两个函数没有其他限制。
calloc
、realloc
和可能的malloc
通常会调用同一个内存分配器。然而,标准中没有规定calloc
和realloc
必须调用malloc
。只要实现符合语言标准的规范,编译器就可以自由地实现这些函数。 - Thomas Matthews