从一段代码里看FreeBSD与Linux内存分配的不同

唉,拖延症无以复加了。

最近,公司移植服务器端游戏引擎到Linux上的时候,遇上了段错误。问题代码大略如下:

char *arr = malloc(len);
...
if (IsInvalid(arr[0])){
    arr++;
}
...
free(arr);

很明显,对操作系统分配的内存块进行了指针操作后,再扔回到free函数进行释放,是会导致异常行为的。但是,该引擎的代码已经有较长的历史了,为什么在FreeBSD上没有遇到问题呢?

这主要是因为FreeBSD与Linux的内存分配机制不同引起的。

Linux的内存分配实现:采用双向链表,每个节点是一大块可以使用的空闲内存,节点头部含有块大小信息。
 
FreeBSD的内存分配实现:应该是采用bitmap图配合数组实现的,通过bitmap标记这块内存已经分配。
 
Linux严格要求,free时传入的ptr,一定是malloc分配的内存(否则找不回来这个块的大小)。
 
FreeBSD没有这个要求,但是当free的指针与malloc的指针距离比较远的时候,泄漏会很严重,甚至比分配的内存还要多,这个要查查。
 
因此,多一个字节,少一个字节,对于依赖bitmap图进行标记的FreeBSD来说,不会影响到系统正常的运行,但是这种纰漏不查出来,以后导致的危险会更大。
原文地址:https://www.cnblogs.com/Lifehacker/p/memory_allocation_difference_between_freebsd_and_linux.html