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

时间:2015-09-11 21:47:05

标签: c memory-management malloc

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

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

除了一般性问题,我还想知道这些编译器的具体答案:OS X上的系统clang与MacPorts的gcc 4.9或5。

2 个答案:

答案 0 :(得分:4)

它应该不是问题。操作系统的ABI指定程序如何调用库函数,并且所有程序和库都应该符合这一点。这允许您将使用不同编译器创建的程序链接在一起。

您的问题表明编译器和库之间存在混淆。使用编译器A编译库并不意味着它使用库A的malloc函数。在链接步骤中指定库,而不是在编译库时指定。创建可执行程序时,将主程序与编译的库和C运行时库链接。 C运行时库中提供了mallocfree,结果可执行文件中只有一个。

答案 1 :(得分:1)

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

我遇到以下情况:

我使用的C库有一个返回数组的函数。用户在不再需要时必须为free d。我使用MSVC使用此库的预编译DLL。但是,DLL是使用MinGW编译的。在MinGW的free分配的内存上使用MSVC的malloc会导致崩溃。但是确保free / malloc总是在兼容对中使用避免了麻烦,即使我的程序使用的是与DLL不同的C编译器。