当不同的对象文件使用不同的malloc实现时会发生什么

当不同的对象文件使用不同的malloc实现时会发生什么,c,memory-management,C,Memory Management,我有几个问题 假设一个程序是使用2个对象文件编译的。每个函数的大部分函数都使用malloc和free。但是这些对象文件是在不同的时间生成的,并且碰巧使用了不同的malloc实现。假设实现共享变量名和函数名。这个计划行得通吗?为什么? 如果程序有目标文件1和2,则来自目标文件1的代码调用malloc并分配一些内存,然后释放它。现在,来自对象文件2的代码调用malloc。它能使用被释放的内存吗?它在下面是如何工作的 试图提供一个有用的答案,尽管它还远未完成 第一部分 首先,很难将程序与malloc共

我有几个问题

假设一个程序是使用2个对象文件编译的。每个函数的大部分函数都使用malloc和free。但是这些对象文件是在不同的时间生成的,并且碰巧使用了不同的malloc实现。假设实现共享变量名和函数名。这个计划行得通吗?为什么?

如果程序有目标文件1和2,则来自目标文件1的代码调用malloc并分配一些内存,然后释放它。现在,来自对象文件2的代码调用malloc。它能使用被释放的内存吗?它在下面是如何工作的


试图提供一个有用的答案,尽管它还远未完成

第一部分

首先,很难将程序与malloc共享函数名的两个实现链接起来:重复的定义通常会导致链接器错误。我可以看到我们如何使用GNUBINUTILS来实现这一点,对于其他工具链可能也有一些相同的技巧。对于其余的答案,让我们假设我们成功地链接了两个实现。这通常是一件好事,你得到链接器错误,而不是混合两个实现,甚至可能引入malloc/free不对称,这几乎没有机会工作

我们还假设分配给一个特定实现的内存总是使用同一个实现的free释放。否则,它几乎肯定会失败

这两种实现可能一起工作,也可能相互干扰,这取决于它们在本地堆耗尽空间时如何从操作系统请求更多内存。MS Windows有一个管理堆的系统界面,两个不同的malloc可能会构建在其上;没有什么能阻止他们一起工作。使用类似sbrk的调用请求内存的实现将一起工作,如果它们都准备好了,其他人将独立于malloc请求sbrk增加。我希望glibc的malloc不会在这里失败,但我不是很确定

第二部分

如果对象1使用的实现能够将内存返回操作系统,那么对象2调用的实现可以重用内存。也就是说,内存重用可能会发生,但其可能性比使用单个实现时要小


将内存返回操作系统的可能性取决于malloc/free实现,也可能取决于分配的块大小和各种系统设置。例如,glibc对大块内存使用匿名mmap,这些内存块在释放时将被取消映射。

试图提供一个有用的答案,尽管它还远未完成

第一部分

首先,很难将程序与malloc共享函数名的两个实现链接起来:重复的定义通常会导致链接器错误。我可以看到我们如何使用GNUBINUTILS来实现这一点,对于其他工具链可能也有一些相同的技巧。对于其余的答案,让我们假设我们成功地链接了两个实现。这通常是一件好事,你得到链接器错误,而不是混合两个实现,甚至可能引入malloc/free不对称,这几乎没有机会工作

我们还假设分配给一个特定实现的内存总是使用同一个实现的free释放。否则,它几乎肯定会失败

这两种实现可能一起工作,也可能相互干扰,这取决于它们在本地堆耗尽空间时如何从操作系统请求更多内存。MS Windows有一个管理堆的系统界面,两个不同的malloc可能会构建在其上;没有什么能阻止他们一起工作。使用类似sbrk的调用请求内存的实现将一起工作,如果它们都准备好了,其他人将独立于malloc请求sbrk增加。我希望glibc的malloc不会在这里失败,但我不是很确定

第二部分

如果对象1使用的实现能够将内存返回操作系统,那么对象2调用的实现可以重用内存。也就是说,内存重用可能会发生,但其可能性比使用单个实现时要小

将内存返回操作系统的可能性取决于malloc/free实现,也可能取决于分配的块大小和各种系统设置。例如,glibc对大块内存使用匿名mmap,这些内存块在释放时将被取消映射