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字节来满足你分配无内存的请求。

原文地址:https://www.cnblogs.com/Mayfly-nymph/p/9218884.html

时间: 2024-10-01 09:54:43

malloc(0)分配多少内存?(译文)的相关文章

C:malloc/calloc/realloc/alloca内存分配函数

原文地址:http://www.cnblogs.com/3me-linux/p/3962152.html calloc(), malloc(), realloc(), free(),alloca() 内存区域可以分为栈.堆.静态存储区和常量存储区,局部变量,函数形参,临时变量都是在栈上获得内存的,它们获取的方式都是由编译器自动执行的. 利用指针,我们可以像汇编语言一样处理内存地址,C 标准函数库提供了许多函数来实现对堆上内存管理,其中包括:malloc函数,free函数,calloc函数和rea

程序猿之---C语言细节17(求time_t的最大值、strlen求的是长度、malloc分配字符内存细节、switch的中default细节)

主要内容:求time_t的最大值.strlen求的是长度.malloc分配字符内存细节.switch的中default细节 #include <stdio.h> #include <time.h> int main() {     /*****************************************************************         time_t最大值测试     ************************************

malloc/calloc/realloc/alloca内存分配函数

calloc(), malloc(), realloc(), free(),alloca() 内存区域可以分为栈.堆.静态存储区和常量存储区,局部变量,函数形参,临时变量都是在栈上获得内存的,它们获取的方式都是由编译器自动执行的. 利用指针,我们可以像汇编语言一样处理内存地址,C 标准函数库提供了许多函数来实现对堆上内存管理,其中包括:malloc函数,free函数,calloc函数和realloc函数.使用这些函数需要包含头文件stdlib.h. 四个函数之间的有区别,也有联系,我们应该学会把

malloc函数分配内存失败的常见原因

malloc()函数分配内存失败的常见原因:  1. 内存不足.  2. 在前面的程序中出现了内存的越界访问,导致malloc()分配函数所涉及的一些信息被破坏.下次再使用malloc()函数申请内存就会失败,返回空指针NULL(0). malloc中做了哪些事情: 简单的说就是系统中有一个位置标记,标记了 当前已经用掉的内存用到了什么位置,系统中还有一个链表把各个未用的内存块连接起来,申请新内存的时候就未分配的链表中依次查找一个够用的内存块,把这次分配的内存地址返回给用户,把这次用掉的进行映射

netty源码解解析(4.0)-23 ByteBuf内存管理:分配和释放

ByteBuf内存分配和释放由具体实现负责,抽象类型只定义的内存分配和释放的时机. 内存分配分两个阶段: 第一阶段,初始化时分配内存.第二阶段: 内存不够用时分配新的内存.ByteBuf抽象层没有定义第一阶段的行为,但定义了第二阶段的方法: public abstract ByteBuf capacity(int newCapacity) 这个方法负责分配一个长度为newCapacity的新内存. 内存释放的抽象实现在AbstractReferenceCountedByteBuf中实现,这个类实

malloc和free的内存到底有多大?——GNU glib库

大家应该都比较熟悉这一点:malloc分配的内存一定大于用户指定的大小!而且很多人也问过这样的问题:到底大多少?以及实际上malloc到底分配了多少? 我们知道这个大小一定在某个"神奇"地方记录着,但是就像自己的"思维"一样,你确无法感知!不过,这是错觉,只是我们习惯了只使用,而没有深入剖析源码,在这里我将揭开这个面纱,去掉其透明化! 声明:源码基于GNU glib库的2.7版本的malloc目录下相关文件 再声明:不同的C库实现方式不一定一样,这里是glib库,如

程序员之---C语言细节22(函数返回指针注意事项&amp;lt;悬空指针&amp;gt;、查看进程能够分配的内存大小)

主要内容:函数返回指针注意事项<悬空指针>.查看进程能够分配的内存大小 #include <stdio.h> char * favorite_fruit() { static char fruit[] = "apple"; // 不加static的话这个函数还回的指针会悬空,由于在函数退出时fruit组数被销毁 // 加了static后fruit数组分配在数据段里,而不是堆栈中.生命期和程序一样长,函数退出时变量 // 依旧有效 return fruit; }

ACE服务端编程3:ACE跨平台之分配堆内存

ACE服务端编程系列的第三篇,探究ACE解决不同编译器之间分配堆内存的差异. 在ACE的官方示例中会看到大量的ACE_NEW_RETURN,ACE_NEW这样的宏,这是ACE为了消除不同编译器编译的代码在堆上分配内存失败的行为差异. 具体来说: 使用 malloc/calloc 等分配内存的函数时,一定要检查其返回值是否为“空指针”(亦即检查分配内存的操作是否成功),这是良好的C++编程习惯,也是编写可靠服务端程序所必需的. 如果使用 new 分配内存失败时,C++标准的规定是抛出异常,如果想检

几个系统调用分析 glibc中的malloc调用和共享内存原理

本文主要分析内存以及I/O相关的系统调用和库函数的实现原理,根据原理给出在使用过程中需要注意的问题和优化的侧重点,本文涉及到的系统调用包括readahead,pread/pwrite,read/write,mmap,readv/writev,sendfile,fsync/fdatasync/msync,shmget,malloc. 本文先简单介绍应用程序对内存的使用以及I/O系统对内存的使用的基本原理,这对理解上述系统调用和库函数的实现有很大帮助. 1 内存管理基础 Linux对物理内存的管理是