原文地址:http://prog21.dadgum.com/179.htmlhtml
在大多的系统中,这个C的小程序将会吸取所有空闲的内存。小程序
while(1){ malloc(0); }
在咱们聊malloc(0)以前,让咱们看看malloc(1)这个更简单的状况。spa
这有一个关于malloc的新的有趣的C程序问题:”用一个指针去动态的分配内存,咱们能怎样决定它指向多少字节(byte)?“这个答案是使人沮丧的“你不能决定。”可是当你调用free在相同的指针,内存分配知道这个块(block)有多大,因此它存储在计算机某个地方。这个地方通常是相邻分配内存,以及分配器须要的任何其余实现特定的数据。指针
在广泛的dlmalloc的实现中,在4~16字节的这个开销被添加到一个请求中,根据库怎样被预编译和是否指针是32或者64位。8字节对于64位系统是一个合理的猜想。code
更糟糕的事情是,一个最小的块可以被malloc返回。对齐是缘由之一。若是有一个整型大小的空间被隐秘的向每一个块中添加,那么它不会有意义对于分配一个比整型更小的块。但也有另外一个缘由:当一个块是空闲的时候,它会被某种方式追踪。或许它进入一个链表,或者进入一个树中,或者一些更有趣的。无论怎样,指针或者其余的数据让工做不得不去某个地方,而在刚刚释放的块中则是自由的选择。htm
在dlmalloc中,一个64位系统中最小被容许分配的大小是32位。回到malloc(1)的问题,8字节的开销被添加到咱们须要的单个字节中,而且总共一块儿的是比最小的32更小,因此咱们的答案是:malloc(1)分配32字节。blog
如今咱们可以着手处理分配0字节的问题。它证实事实会有一个愚蠢的辩论,而且它尚未被解决,因此技术上分配0字节是特定于实现的行为。一面认为malloc(0)应该返回一个空指针并完成它。它执行,若是你不介意一个空的返回值服务双重责任。它也意味着“内存外”或者“你不须要任何内存。”内存
更加广泛的形式是malloc(0)返回一个特别的指针。你不该该引用那个指针,由于它是概念上的指向0字节,从上文的探讨咱们得知,至少dlmalloc在64位系统中将老是分配一个32字节的块,因此这个最后的答案:它须要32字节来知足你分配无内存的请求。get