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

VC++
VC++ 的常用编程技巧
VC++编译环境详解
Visual C++制作一个Sniffer实例
vc.net中实现启动画面来个淡入淡出效果
VC++中进程间相互通信的十一种方法
深入了解VC++编译器
VC++删除浮动工具条中“关闭”按钮
VISUAL C++中的OCX控件的使用方法
VC++:用VC++实现上网拨号功能
VC++:基于VC++中ATL创建ActiveX控件的探讨
VC++删除浮动工具条中“关闭”按钮
VC++:VC++中的面向对象和Windows编程
VC++:Vc++中线程的同步
VC++:更新命令用户接口(UI)消息
VC++:CDatabase类的那些事
VC++:小编谈VC++中 CDatabase类的那些事
VC++:小编泛谈MFC的ODBC类
VC++:小编分享线程的创建和终止
在VC资源文件中加入声音资源
C++的static关键字

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 335 ::
收藏到网摘: 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一下,所有变量都出于未分配状态,就好像是一个没有分配目标内存地址的指针,肯定是不能使用的。