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

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

while(){
malloc();
}

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

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

  1. 从malloc中窥探Linux内存分配策略

        malloc函数是C/C++中常用内存分配库函数,本篇文章将以Linux平台上的malloc为剖析对象,深入了解分配一块内存的旅程. malloc入门      使用malloc,需要包含头文 ...

  2. 在内存充足时malloc函数分配内存失败的原因及解决

    昨天在修改自己的代码的时候,碰到了malloc函数内存分配失败,上网翻了翻,一个很可能的原因是之前的代码出现了越界操作,导致malloc分配函数所涉及的一些信息被破坏.在这个思想的指导下,今天又是郁闷 ...

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

    原文地址:http://www.cnblogs.com/3me-linux/p/3962152.html calloc(), malloc(), realloc(), free(),alloca() ...

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

    calloc(), malloc(), realloc(), free(),alloca() 内存区域可以分为栈.堆.静态存储区和常量存储区,局部变量,函数形参,临时变量都是在栈上获得内存的,它们获取 ...

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

    malloc()函数分配内存失败的常见原因:  1. 内存不足.  2. 在前面的程序中出现了内存的越界访问,导致malloc()分配函数所涉及的一些信息被破坏.下次再使用malloc()函数申请内存 ...

  6. 栈 堆 stack heap 堆内存 栈内存 内存分配中的堆和栈 掌握堆内存的权柄就是返回的指针 栈是面向线程的而堆是面向进程的。 new/delete and malloc/ free 指针与内存模型

    小结: 1.栈内存 为什么快? Due to this nature, the process of storing and retrieving data from the stack is ver ...

  7. malloc分配的内存空间是连续的吗

    1.linux内核管理内存空间的分配,所有程序对内存空间的申请和其他操作,最终都会交给内核来管理. 2.linux实现的是“虚拟内存系统”,对用户而言,所有内存都是虚拟的,也就是说程序并不是直接运行在 ...

  8. malloc函数和其他内存分配函数

    1. 需要包含头文件:#i nclude 或 #i nclude 函数声明(函数原型): void *malloc(int size); 说明:malloc 向系统申请分配指定size个字节的内存空间 ...

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

    ByteBuf内存分配和释放由具体实现负责,抽象类型只定义的内存分配和释放的时机. 内存分配分两个阶段: 第一阶段,初始化时分配内存.第二阶段: 内存不够用时分配新的内存.ByteBuf抽象层没有定义 ...

随机推荐

  1. 找BUG

    找一找BUG 一段代码,实现一个pop,push,和getmin都是O(1)的方法. 最初源代码 伙伴代码如下,代码的地址可以通过这个访问: Ubuntu Pastebin https://paste ...

  2. 简单的使用rabbitmq的例子

    1.创建了两个项目 : (1).spring_cloud_rabbitmq_send 消息发送者 (2).spring_cloud_rabbitmq_receive  消息接受者 2. 添加rabbi ...

  3. Owin password

    一.什么是OAuth OAuth是一个关于授权(Authorization)的开放网络标准,目前的版本是2.0版.注意是Authorization(授权),而不是Authentication(认证). ...

  4. 使用metasploit进行栈溢出攻击-3

    有了shellcode,就可以进行攻击了,但是要有漏洞才行,真实世界中的漏洞很复杂,并且很难发现,因此我专门做一个漏洞来进行攻击. 具体来说就是做一个简单的tcp server,里面包含明显的栈溢出漏 ...

  5. 源码方式安装rabbitmq

    由于工作环境中属于内网,yum安装方式不可用,所以需要采用源码进行rabbitmq的安装.rabbitmq是基于erlang环境进行运行的,所以需要先按照erlang环境,才能运行rabbitmq-s ...

  6. CentOS6.5上Zabbix3.0的RPM安装【三】-安装并添加Agent

    七.Download and install Zabbix Agent Zabbix Agent is required to install on all remote systems needs  ...

  7. 关于php缓存技术一些见解

    参考的网站[很重要] ①.模拟高并发: https://blog.csdn.net/yxwb1253587469/article/details/50572927 https://blog.csdn. ...

  8. 求解热传导方程matlab

    这是非稳态一维热传导的方法,也叫古典显格式. 如果是做数学建模,就别用了,这种方法计算量比较大,算的很慢,而且收敛不好. 但是如果实在没办法也能凑合用. 该改的地方我都用???代替了. 给个详细解释h ...

  9. 安装Scrapy报错 error: Microsoft Visual C++ 14.0 is required解决方法

    [问题背景]:在Windows 10系统,pip install Scrapy,报错error: Microsoft Visual C++ 14.0 is required,还有提示Twisted需要 ...

  10. i++操作非原子的验证代码

    package incre; public class Incre { public static void main(String[] args) { class Count implements ...