1、什么是堆?
 堆(heap)是一种内存管理方式。内存管理对操作系统来说是一件非常复杂的事情,因为首先内存容量很大,
 其次就是内存需求在时间和大小块上没有规律(操作系统上运行着几十甚至几百个进程,这些进程可能随时
 都会申请或者是释放内存,并且申请和释放的内存块大小是随意的)。
 堆这种内存管理方式的特点就是自由(随时申请、随时释放、大小块随意)。堆内存是操作系统划归给堆管
 理器(操作系统中的一段代码,属于操作系统的内存管理单元)来管理的,然后向使用者(用户进程)提供
 API(malloc和free)来使用堆内存。
 
 我们什么时候使用堆内存?
 当我们需要的内存容量比较大时,需要反复使用及释放时,很多数据结构(譬如链表)的实现都要使用堆内存。
 
2、堆管理内存的特点(大块内存、手工分配&使用&释放)
 特点一:容量不限(常规使用的需求容量都可以满足)
 特点二:申请及释放都需要手工运行,手工进行的含义就是需要程序员写代码明确进行申请malloc及释放free。
 如果程序员申请内存并使用后未释放,这段内存就丢失了(在堆管理器的记录中,这段内存仍然属于你这个进程,
 但是进程自己又以为这段内存已经不用了,所以进程再次运行的时候,就又会去申请新的内存块,这就叫做吃内存),
    称之为内存泄漏。在C/C++语言中,内存泄漏是最严重的程序bug,这也是别人认为Java/C#等语言比C/C++优秀的地方。
3、C语言操作堆内存的接口(malloc free)
    堆内存释放的时候最简单,直接调用free释放即可。  void free(void *ptr);
 堆内存申请时,有3个可选择的类似功能的函数:malloc ,calloc, realloc
 void *malloc(size_t size);
 void *calloc(size_t nmemb, size_t size);     //nmemb个单元,每个单元size字节
 void *realloc(void *ptr, size_t size);       //改变原来申请的空间的大小的
 
 譬如要申请10个int元素的内存:
 malloc(40);           malloc(10 * sizeof(int));
 calloc(10, 4);        calloc(10, sizeof(int));
 
 数组定义时必须同时给出数组元素个数(数组大小),而且一旦定义在无法更改。
 堆内存在申请时必须给定大小,然后一旦申请完成大小不变,如果要变只能通过realloc接口。
4、堆的优势和劣势(管理大块内存、灵活、容易内存泄漏)
 优势:灵活
 劣势:需要程序员去处理各种细节,所以容易出错,严重依赖于程序员的水平。

内存管理之堆heap的更多相关文章

  1. java内存管理(堆、栈、方法区)

    java内存管理 简介 首先我们要了解我们为什么要学习java虚拟机的内存管理,不是java的gc垃圾回收机制都帮我们释放了内存了吗?但是在写程序的过程中却也往往因为不懂内存管理而造成了一些不容易察觉 ...

  2. C++内存管理学习堆和栈

    来源:http://c.chinaitlab.com/basic/936306_2.html 一 C++内存管理 1.内存分配方式 在讲解内存分配之前,首先,要了解程序在内存中都有什么区域,然后再详细 ...

  3. JAVA内存管理之堆内存和栈内存

    我们常常做的是将Java内存区域简单的划分为两种:堆内存和栈内存.这种划分比较粗粒度,这种划分是着眼于我们最关注的.与对象内存分配密切相关的两类内存域.其中栈内存指的是虚拟机栈,堆内存指的是java堆 ...

  4. javascript内存管理(堆和栈)和javascript运行机制

    内存基本概念 内存的生命周期: 1.分配所需的内存 2.内存的读与写 3.不需要时将其释放 所有语言的内存生命周期都基本一致,不同的是最后一步在低级语言中很清晰,但是在像JavaScript 等高级语 ...

  5. 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件

    本文背景: 在编程中,很多Windows或C++的内存函数不知道有什么区别,更别谈有效使用:根本的原因是,没有清楚的理解操作系统的内存管理机制,本文企图通过简单的总结描述,结合实例来阐明这个机制. 本 ...

  6. .NET面试题解析(06)-GC与内存管理

      系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 GC作为.NET的重要核心基础,是必须要了解的.本文主要侧重于GC内存管理中的一些关键点,如要要全面深入了 ...

  7. RTT之内存管理及异常中断

    内存管理分静态内存管理和动态内存管理(根据大小又分2种) 静态内存管理:创建.删除.初始化.解绑.申请和释放.初始化内存池是属于静态内存管理,与创建内存池不同的是,此处内存池对象所使用的内存空间是由用 ...

  8. C语言讲义——内存管理

    动态分配内存 动态分配内存,在堆(heap)中分配. void *malloc(unsigned int num_bytes); 头文件 stdlib.h或malloc.h 向系统申请分配size个字 ...

  9. Spark内存管理机制

    Spark内存管理机制 Spark 作为一个基于内存的分布式计算引擎,其内存管理模块在整个系统中扮演着非常重要的角色.理解 Spark 内存管理的基本原理,有助于更好地开发 Spark 应用程序和进行 ...

随机推荐

  1. SQL server 注入 和 SQL server 扩展(10.29 第二十九天)

    Step1:检测注入点 Step2: select * from sysobjects   (sysobjects 系统对象表,保存当前数据库的对象) select * from users wher ...

  2. SQL中行转列(PIVOT)与列转行(UNPIVOT)

    一.行转列 1.测试数据准备 CREATE TABLE [StudentScores] ( ), --学生姓名 ), --科目 [Score] FLOAT, --成绩 ) 执行结果: 2.行转列sql ...

  3. webapi------宿主程序

    业务场景: 公司的容器程序需要给前端暴露接口但是代码里面又不想写webapi项目工程就用到了宿主可以达到webapi的效果 1.owin实现 2.其他实现 测试实现如下 1.新建一个控制台程序 2.新 ...

  4. java排序,效率高的是哪种排序方法

    和所有其他语言是一样的.应该还是快速排序效率最高. public static void bubbleSort(int a[]) {int len = a.length;for (int i = 0; ...

  5. 转载:HTTP 请求头中的 X-Forwarded-For,X-Real-IP

    转载:https://www.cnblogs.com/diaosir/p/6890825.html  X-Forwarded-For 在使用nginx做反向代理时,我们为了记录整个的代理过程,我们往往 ...

  6. JAXB工具

    在JDK6之后,都自带了JAXB工具,所以在jdk类库与tomcat WEBAPP类库之间,会造成冲突 https://blog.csdn.net/iteye_13776/article/detail ...

  7. P 1020 月饼

    转跳点:

  8. Linux终端命令行的常用快捷键

    history 显示命令历史列表 ↑(Ctrl+p) 显示上一条命令 ↓(Ctrl+n) 显示下一条命令 !num 执行命令历史列表的第num条命令 !! 执行上一条命令 !?string? 执行含有 ...

  9. MySQL日志--二进制日志

    (一)什么是二进制日志 二进制日志(binlog)记录了数据库中所有的DDL和DML操作,但是不包括select语句,语句以"事件"的形式保存,记录了数据库的更改变化,在主从复制( ...

  10. Jenkins-在CentOS7 上安装配置

    Jenkins-在CentOS7 上安装配置 1.安装JDK yum install -y java 2.安装jenkins 方法1:添加Jenkins库到yum库,Jenkins将从这里下载安装. ...