当前位置: 首页 > 图文教程 > 开发语言 > VC++ > VC++ 内存机理的个人理解:堆和栈

VC++
如何实现24位色工具条
如何定制浮动工具条
如何实现工具栏的下拉箭头按钮
Outlook式样界面菜单和页面控制
如何在状态栏中实现进度指示器控制
Outlook风格的单列使用不同的颜色显示新邮件数
为CListBox加上智能水平滚动条
如何实现类似VC属性表中的钉子按钮
在窗体中加入3D Bar
通过程序向RichEditView写文本
如何在工具栏上添加平面下拉控件
按数据库记录构建树控件
树控件的双击响应
VC++中轻松实现滑动控件
深入浅出 CPropertySheet
如何在ListBox中选择背景位图
在对话框中加入属性页
如何在EDITBOX控件中使用背景位图
如何在树型控件中使用背景位图
树型控件拖动的完美实现

VC++ 内存机理的个人理解:堆和栈


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 351 ::
收藏到网摘: n/a

首先,关于堆和栈的数据结构小凡就不多说什么了,是先进先出还是后进先出也不是我们讨论的范围。

    但是有一点还是很不一样的,栈内存空间一般而言要比堆内存空间小很多,对windows来说,一个thread的栈内存是1M,但是堆内存可以按照你的需要申请甚至好几个G(当然到时候要用硬盘缓存这个就是题外话了)。

    从编码上看,也是有一些区别的。

 int intInStack=0;
int *intInHeap=(int *)malloc(sizeof(int));
*intInHeap=0;
delete intInHeap;

    在以上的代码中,intInStack就是存放在栈内存中的0,而intInHeap就是一个指向堆内存中的0的指针。没错,这就是C++分配堆内存和栈内存在代码上的区别,对C++来说,不管是值类型还是引用类型,都是通过这样的方式来申请堆内存和栈内存。而且,有一点更重要:堆内存是需要自维护的!delete intInHeap;如果不写,那这块内存就永远不释放,甚至程序关闭了也不会释放,这就是有名的内存溢出问题。

   

    题外话,C#中的堆栈内存分配方式:

    C#中,除了class以外,其它类型其实都是值类型,包括struct。小凡想很多人都认为new的就是分配在堆内存上了,事实上:

int i = 0;
int i2 = new int();

int i3 = new Int32();

    这三行代码是等价的,它们都是值类型,所以,并不是C#中的new就保证在堆内存上。

    其实很简单,C#中是通过class声明的变量,就是引用类型,引用类型一律放在堆内存中。其它类型都是值类型,一律放在栈内存中。

    什么?你问Int32?仔细看看,它是struct,你试试继承Int32看看就知道了。为什么要new?因为如果不new一下,所有变量都出于未分配状态,就好像是一个没有分配目标内存地址的指针,肯定是不能使用的。