[英]What happens when different object files use different malloc implementations
我有一些问题。
假设程序是使用2个目标文件编译的。 每个人在大多数功能中都使用malloc和free。 但是这些目标文件是在不同时间生成的,并且碰巧使用了不同的malloc实现。 假设实现共享变量名和函数名。 该程序能否正常运行? 为什么?
如果程序具有目标文件1和2,则目标文件1中的代码调用malloc并分配一些内存,然后释放它。 现在,来自目标文件2的代码将调用malloc。 它可以使用已释放的内存吗? 它在下面如何工作?
试图提供一个有用的答案,尽管还远远没有完成。
第1部分。
首先,将程序与malloc共享函数名的两种实现链接起来非常困难:重复定义通常会导致链接器错误。 我可以看到我们如何使用GNU binutils做到这一点,其他工具链可能也有一些等效的技巧。 对于其余的答案,让我们假设我们成功地链接了两个实现。 (获得链接器错误而不是混合两个实现,这通常是一件好事,甚至可能引入几乎没有机会工作的malloc / free不对称)。
我们还假设分配给一个特定实现的内存始终使用同一个实现中的free
释放。 否则,几乎可以保证它会失败。
当本地堆空间不足时,这两种实现可能一起工作,也可能会干扰,这取决于它们如何从OS请求更多内存。 MS Windows具有一个用于管理堆的系统接口,并且可能在其之上构建两个不同的malloc
。 然后没有什么可以阻止他们一起工作。 如果它们都准备好让其他人独立于malloc
来请求sbrk
增加,则通过sbrk
的调用请求内存的实现将一起工作。 我希望glibc中的malloc不会在这里失败,但是我不确定。
第2部分。
如果对象1使用的实现能够将内存返回给OS,则对象2调用的实现可以重用内存。也就是说,内存重用可能会发生,但是比使用单个实现的可能性要小。
将内存返回给OS的可能性取决于malloc / free的实现,还可能取决于分配的块大小和各种系统设置。 例如,glibc对大块内存使用匿名mmap
,并且释放时这些块不会被映射。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.