A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 朱磊 黑马帝   /  2012-1-3 10:20  /  2288 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

如题:谁能给我讲一下堆和栈的区别?

评分

参与人数 1技术分 +2 收起 理由
李荣壮 + 2

查看全部评分

4 个回复

倒序浏览
栈,由编译器自动分配释放,其操作方式类似于数据结构中的栈。
堆,一般由程序员分配释放,分配方式倒是类似于链表。

评分

参与人数 1技术分 +1 收起 理由
李荣壮 + 1

查看全部评分

回复 使用道具 举报
堆是一块内存区域,在堆里可以分配大块的内存用于存储某类型的数据。与栈不同,堆里的内存可以任意顺序存入和移除。栈则只能后进先出

评分

参与人数 1技术分 +2 收起 理由
李荣壮 + 2

查看全部评分

回复 使用道具 举报
整理和总结如下:

先从C语言里的看(内存四个区之二):
1)栈区:用来存放函数的形参和函数内的局部变量。由编译器分配空间,在函数执行完后由编译器自动释放
2)堆区(动态存储区):用来存放由动态分配函数(如malloc)分配的空间。是由程序员自己手动分配的,并且必须由程序员使用free释放。如果忘记用free释放,会导致所分配的空间一直占着不放,导致内存泄露。

然后返回再到我们C#这样更好理解:

1).在.NET Framework中,内存中的资源分为"托管资源"和"非托管资源".托管资源必须接受.NET Framework的CLR(通用语言运行时)的管理(诸如内存类型安全性检查),而非托管资源则不必接受.NET Framework的CLR管理.

托管资源在.NET Framework中又分别存放在两种地方: "堆栈"和"托管堆"(堆栈是栈不是两者!);

2).在C#中,虚拟内存中有两个存储变量的区域,一个堆栈和一个托管堆(如下图-表格形式):

进程                                4G虚拟内存(存储.exe/.dll/程序运行的所有变量)
堆栈(值类型):       
托管堆(引用类型):    CLR初始化进程时,为进程保留的一个进程地址空间区域,用于存储和管理对象,受      
                                  圾收集器的控制和管理!


回复 使用道具 举报
个人整理和总结如下:

先从C语言看(内存 四个区之二):

1)栈区:用来存放函数的形参和函数内的局部变量。由编译器分配空间,在函数执行完后由编译器自动释放。
2)堆区(动态存储区):用来存放由动态分配函数(如malloc)分配的空间。是由程序员自己手动分配的,并且必须由程序员使用free释放。如果忘记用free释放,会导致所分配的空间一直占着不放,导致内存泄露。

再回到C#,这样更好理解:

1) 在.NET Framework中,内存中的资源(即所有二进制信息的集合)分为"托管资源"和"非托管资源".托管资源必须接受.NET Framework的CLR(通用语言运行时)的管理(诸如内存类型安全性检查),而非托管资源则不必接受.NET Framework的CLR管理.

托管资源在.NET Framework中又分别存放在两种地方: "堆栈"和"托管堆":

2)在C#中,虚拟内存中有两个存储变量的区域,一个堆栈和一个托管堆:

进程                               4G虚拟内存(存储.exe/.dll/程序运行的所有变量)
堆栈(值类型)        :
托管堆(引用类型):        CLR初始化进程时,为进程保留的一个进程地址空间区域,用于存储和管理对象,受垃
                                圾收集器的控制和管理!

3)而堆和栈的问题的理解主要是为了解释参数传递问题!如:按值传递不会改变形参值,而按址传递会改变行参的值的我问题!

我上次不是发了个附件给你!讲的就是给这个问题!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马