realloc和calloc会调用malloc吗?

5

这可能是一个简单的问题,但我找不到答案。在realloc和calloc内部是否会调用malloc?由于我在某种程度上正在计算malloc调用次数,因此这对我很有趣。谢谢。


5
你需要查看你的编译器的实现。 - R. Martinho Fernandes
你是在编译C还是C++? - Puppy
1
许多编译器通过使用一个内存分配函数来简化它们的代码。callocrealloc和可能的malloc通常会调用同一个内存分配器。然而,标准中没有规定callocrealloc必须调用malloc。只要实现符合语言标准的规范,编译器就可以自由地实现这些函数。 - Thomas Matthews
4个回答

6

在 IT 技术中,你不应该依赖于系统、库或编译器特定的机制。即使你知道 realloc 在某个系统/编译器/库上会调用 malloc,你也不能确保在其他系统上它会以相同的方式处理。

那么问题来了,你想要实现什么目标?如果你需要跟踪内存使用情况,在 C++ 中有更好的方法,例如安装一个全局替换操作符 new 和 delete。在某些 Linux 版本中,你还可以添加 malloc 钩子(我从未使用过这个功能)。在其他系统上,你可以使用其他机制更安全地实现你需要的功能。


实际上,我正在实现钩子来跟踪动态内存使用情况,例如malloc等。你知道有更好的方法吗? - yui
好的,如果realloc也调用了malloc,那么我需要在我的程序中考虑这一点。 - yui
4
不要编写自己的工具来跟踪动态内存使用情况。使用已经编写并测试过的工具。 - Thomas Matthews
根据你想要做什么,答案可能是:不要这样做,使用比你能够编写的任何工具都更好的工具,或者使用新的处理程序,或者编写自己的内存处理程序并强制每个人都使用它。问题仍然存在:你想要实现什么(即为什么需要内存跟踪),而不是如何实现它。 - LiKao
@Thomas Matthews & LiKao:我正在编写一个程序,用于跟踪动态内存(实际上只需要准确的最大使用动态内存值),并根据结果决定采取哪些进一步的步骤(它应该自动监视性能)。 - yui
你可以使用libproc来实现,它应该能够实时确定程序实际使用的内存(包括不直接使用但在内部使用的内存)。这比使用其他方法更可靠。 - LiKao

2

如果您正在使用Linux,则可能正在使用glibc。您可以查看glibc malloc源代码,并查看它从诸如calloc之类的函数中调用了称为__malloc_hook的东西。这是一个记录在案的功能,可用于拦截和计算分配次数。您可以从mallinfo获取其他有用的统计信息。但是请先查看是否有现有工具可以实现您想要的功能。内存管理调试和统计是常见的需求!


1

你可以编写一个简单的测试程序,调用realloc和calloc,并将其输入到Valgrind工具中的callgrind。它会显示调用图,这样你就可以检查malloc和calloc在你的libc实现中调用了哪些函数。


0

从语言标准上来看,我们并不清楚。C99对函数之间的调用与否没有做出任何规定。

C++只是说malloc不能调用new,但对这两个函数没有其他限制。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接