malloc(0)分配多少内存?(译文)

原文地址:http://prog21.dadgum.com/179.html

  在大多的系统中,这个C的小程序将会吸收全部空闲的内存。

while(1){
    malloc(0);
}

在我们聊malloc(0)之前,让我们看看malloc(1)这个更简单的情况。

   这有一个关于malloc的新的有趣的C程序问题:”用一个指针去动态的分配内存,我们能怎样决定它指向多少字节(byte)?“这个答案是令人沮丧的“你不能决定。”但是当你调用free在相同的指针,内存分配知道这个块(block)有多大,所以它存储在计算机某个地方。这个地方一般是相邻分配内存,以及分配器需要的任何其他实现特定的数据。

  在普遍的dlmalloc的实现中,在4~16字节的这个开销被添加到一个请求中,根据库怎样被预编译和是否指针是32或者64位。8字节对于64位系统是一个合理的猜测。

  更糟糕的事情是,一个最小的块能够被malloc返回。对齐是原因之一。如果有一个整型大小的空间被隐秘的向每个块中添加,那么它不会有意义对于分配一个比整型更小的块。但也有另一个原因:当一个块是空闲的时候,它会被某种方式追踪。或许它进入一个链表,或者进入一个树中,或者一些更有趣的。不管怎样,指针或者其他的数据让工作不得不去某个地方,而在刚刚释放的块中则是自由的选择。

  在dlmalloc中,一个64位系统中最小被允许分配的大小是32位。回到malloc(1)的问题,8字节的开销被添加到我们需要的单个字节中,并且总共一起的是比最小的32更小,所以我们的答案是:malloc(1)分配32字节。

  现在我们能够着手处理分配0字节的问题。它证明事实会有一个愚蠢的辩论,并且它还没有被解决,所以技术上分配0字节是特定于实现的行为。一面认为malloc(0)应该返回一个空指针并完成它。它执行,如果你不介意一个空的返回值服务双重责任。它也意味着“内存外”或者“你不需要任何内存。”

  更加普遍的形式是malloc(0)返回一个特别的指针。你不应该引用那个指针,因为它是概念上的指向0字节,从上文的探讨我们得知,至少dlmalloc在64位系统中将总是分配一个32字节的块,所以这个最后的答案:它需要32字节来满足你分配无内存的请求

posted @ 2018-06-23 21:09  Hk_Mayfly  阅读(1413)  评论(0编辑  收藏  举报