编译器之间 free/malloc 的兼容性

Compatibility of free/malloc between compilers

假设我有一个用编译器 A 编译的库。它使用 malloc() 分配内存并留给我 free() 它。它没有提供特别的免费功能。

我可以用编译器 B 编译我的程序(使用这个库)吗?或者我是否必须担心一个编译器的(标准库的)malloc 与另一个编译器的 free 不兼容?

除了一般性问题之外,我还想知道这些编译器的具体答案:系统 clang on OS X with MacPorts' gcc 4.9 or 5.

应该没有问题。操作系统的 ABI 规定了程序如何调用库函数,所有的程序和库都应该符合这一点。这允许您 link 将使用不同编译器创建的程序放在一起。

您的问题表明编译器和库之间存在混淆。使用编译器 A 编译库并不意味着它使用库 A 的 malloc 函数。库是在 link 步骤中指定的,而不是在编译库时指定的。当您创建可执行程序时,您 link 包含您编译的库和 C 运行时库的主程序。 mallocfree 在 C 运行时库中提供,在生成的可执行文件中只有其中之一。

freemalloc 在编译器之间并不总是兼容。具体来说,they are not compatible between MSVC and MinGW.

我遇到了以下情况:

我使用的 C 库具有 returns 数组的函数。当不再需要时,用户必须 freed 数组。我使用的是使用 MSVC 的这个库的预编译 DLL。但是,DLL 是使用 MinGW 编译的。在使用 MinGW 的 malloc 分配的内存上使用 MSVC 的 free 会导致崩溃。但是确保 free/malloc 始终以兼容的对使用可以避免麻烦,即使我的程序使用与 DLL 不同的 C 编译器也是如此。