http://www.programfan.com/blog/article.asp?id=27508

C++应用中内存分为2部分,一部分是栈(stack,也称堆栈),另一部分是堆(heap)。

栈: 可以把栈看成是一叠卡片,最上面的卡片表示程序的当前作用域,这往往就是当前正在执行的函数。当前函数中声明的所有变量都置于栈顶帧中,即占用栈顶帧的内存,这就相当于一叠卡片中最上面的一张卡片。如果当前函数调用了另一个函数,举例来说,一开始一叠卡片位于最底的卡片是main()函数,main()函数调用了foo()函数,则相当于在这一叠卡片上加了另一张卡片,这样foo()函数就有了自己的栈帧(就是指一块内存空间)以供使用。从main()传递到foo()的所有参数都会从main()栈帧复制到foo()栈帧中。 然后foo()函数又调用了bar()函数,则在这一叠卡片上又加了一张卡片,这样bar()就有了自己的栈帧(stack frame)以供使用,从foo()传递到bar()的参数就会从foo()栈帧复制到bar()栈帧中。 图片如下: foo()函数声明了一个整数值。

栈帧很有意义,因为栈帧可以为每个函数提供一个独立的内存工作区。如果一个变量是在foo()栈帧中声明的,那么调用bar()函数不会对它带来改变,除非你专门要求修改这个变量。另外,foo()函数运行结束时,栈帧既消失,该函数中声明的所有变量就不会再占用内存了。。

堆:堆是一段完全独立于当前函数或栈帧的内存区。如果一个函数中声明了一些变量,而且希望当这个函数结束时其中声明的变量依然存在,就可以将这些变量置于堆中。堆与栈相比,没有那么清晰的结构性。可以把堆看作是一“堆”小玩艺。程序可以在任何时刻向这个“堆”添加新的东西或者修改“堆”中已经有的东西。

            用栈和堆来分析动态分配数组的原理: 根据栈的工作原理,编译器在编译时就必然能够确定每个栈帧有多大。 由于栈帧大小是预定的,因此无法声明一个大小可变的数组。 如: 以下代码就无法通过编译,因为arraySize是变量,而不是常量。

             int arraySize = 8;

             int myVaraibleSizedArray( arraySize );           // 不能通过编译

由于整个数组都要放在栈上,编译器需要准确地知道数组的大小(根据栈的工作原理,编译器在编译时必须要确定每个栈帧有多大。)所以不充许用变量来指定数组大小,如果通过使用动态内存(dynamic memory),把数组放在堆中(而不是栈中),就可以在运行时才指定数组的大小。

要动态分配一个数组,首先需要声明一个指针(pointer):

           int * myVariableSizedArray;

          myVariableSizeArray = new int[arraySize];        // 在堆中分配数组空间

这就会根据arraySize变量的大小来分配相应的内存。可以看到,指针变量任然位于栈中,而指针指向的数组则位于堆中。。

然而由于堆中变量占用的内存空间不会因为程序或函数结束而释放掉(在栈中变量则会因为程序或函数结束而释放内存),因此就需要人工来释放掉堆中的内存。用delete命令来释放内存.

          delete [] myVariableSizeArray;

C++栈和堆原理介绍相关推荐

  1. 字符串的存储方式以及静态存储区域、栈、堆

    下面两篇文章分析得比较详细.转自http://blog.csdn.net/yangdelong/archive/2010/04/03/5447362.aspx 文章来源 http://blog.csd ...

  2. 【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理

    栈基本工作原理 导航 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第 ...

  3. java栈 类 堆_详细介绍Java中的堆和栈

    栈与堆都是Java用来在RAM中寄存数据的中央.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. Java的堆是一个运转时数据区,类的对象从中分配空间.这些对象经过new.newar ...

  4. .NET中栈和堆的比较 #1

    原文出处:http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_memory01122006130034PM/csharp_memory.a ...

  5. JVM学习笔记之-方法区,栈、堆、方法区的交互关系,方法区的理解,设置方法区大小与OOM,方法区的内部结构,方法区使用举例

    栈.堆.方法区的交互关系 运行时数据区结构图 从线程共享与否的角度来看 栈,堆,方法区的交互关系 方法区的理解 方法区在哪里? <Java虚拟机规范>中明确说明:"尽管所有的方法 ...

  6. 内存、数据结构之栈和堆的区别?

    网上有一篇很好的文章,我差不多直接搬运过来了. 来源:http://www.cleey.com/blog/single/id/776.html 原文如下: 可能很多同学在这个概念上有些模糊,其实堆栈分 ...

  7. 栈中函数调用原理_详解

                 函数调用是程序设计中的重要环节,本文就函数调用的过程进行分析. 一.eip.ebp.esp介绍 EIP,EBP,ESP都是系统的寄存器,里面存储的是些地址,我们系统中栈的 ...

  8. 充电原理_电动汽车充电桩如何设置?充电桩原理介绍

    随着新能源产业的蓬勃发展,电动汽车在生活中变得越来越普遍.比亚迪(BYD),宝马(BMW)和特斯拉(Tesla)等汽车制造商都已经推出了全电动汽车,而混合动力汽车则更为普遍.为了能够方便地为这些电动汽 ...

  9. .NET中栈和堆的比较1

    原文出处: http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_memory01122006130034PM/csharp_memory. ...

最新文章

  1. 给用户培训的几点感受
  2. Python 学习笔记之字典(进阶篇)
  3. [Web 前端] react-router4-0中文文档
  4. java 定义一组常量用什么最好_Java语言中定义常量注意事项解析
  5. PAT(乙级)1009
  6. python如何读取csv文件列表页_每25行读取一个csv文件,并使用python传递到列表
  7. 如何看待自己写的烂代码
  8. numpy 数组与矩阵的乘法理解
  9. 视频直播技术(二):延迟优化
  10. aix查看oracle进程内存,Aix 查看进程占用内存大小(按从大小排列)
  11. 保存文件_正确保存Zbrush文件
  12. Java中List集合的三种遍历方式(全网最详)
  13. Myeclipse 2020.5 版本首发!支持 Java14
  14. java筛选excel数据_Excel中的筛选技巧有哪些,总结四种筛选技巧分享给大家
  15. 基于网络安全相关的开源项目技术预研分析报告
  16. 最优化理论与方法(袁亚湘 孙文瑜)笔记(一)
  17. NLP-实体消歧/实体统一
  18. debian系统简单介绍
  19. STM32 通过定时器产生PPM信号
  20. 代码源每日一题-宝箱(贪心/思维)

热门文章

  1. 江苏学计算机软件哪个专科大学好,江苏 我学软件技术可以报考哪些学校
  2. 单线激光雷达(Lidar)学习一:使用单线lidar进行测距
  3. RK3568平台开发系列讲解(音视频篇)如何把音视频流进行网络传输?
  4. MY9221 使用心得
  5. 基于Mui与H5+开发webapp的Android原生工程打包步骤(使用新版本5+SDK与Android studio)(部分内容转自dcloud官网)...
  6. 什么是自动化运维?为什么选择Python做自动化运维?
  7. 迁移学习——Transitive Transfer Learning
  8. 在线编辑PDF:GcPDF|PDF在线预览GrapeCity Documen PDF
  9. 基于jQuery实现弹幕效果
  10. windows电脑系统优化