黑马程序员技术交流社区
标题:
谁能给我讲一下堆和栈的区别?
[打印本页]
作者:
朱磊
时间:
2012-1-3 10:20
标题:
谁能给我讲一下堆和栈的区别?
如题:谁能给我讲一下堆和栈的区别?
作者:
王富恒
时间:
2012-1-3 10:47
栈,由编译器自动分配释放,其操作方式类似于数据结构中的栈。
堆,一般由程序员分配释放,分配方式倒是类似于链表。
作者:
曾伟
时间:
2012-1-3 16:31
堆是一块内存区域,在堆里可以分配大块的内存用于存储某类型的数据。与栈不同,堆里的内存可以任意顺序存入和移除。栈则只能后进先出
作者:
傅涌钦
时间:
2012-1-3 17:06
整理和总结如下:
先从C语言里的看(内存四个区之二):
1)栈区:用来存放函数的形参和函数内的局部变量。由编译器分配空间,在函数执行完后由编译器自动释放
2)堆区(动态存储区):用来存放由动态分配函数(如malloc)分配的空间。是由程序员自己手动分配的,并且必须由程序员使用free释放。如果忘记用free释放,会导致所分配的空间一直占着不放,导致内存泄露。
然后返回再到我们C#这样更好理解:
1).在.NET Framework中,内存中的资源分为"托管资源"和"非托管资源".托管资源必须接受.NET Framework的CLR(通用语言运行时)的管理(诸如内存类型安全性检查),而非托管资源则不必接受.NET Framework的CLR管理.
托管资源在.NET Framework中又分别存放在两种地方: "堆栈"和"托管堆"(堆栈是栈不是两者!);
2).在C#中,虚拟内存中有两个存储变量的区域,一个堆栈和一个托管堆(如下图-表格形式):
进程 4G虚拟内存(存储.exe/.dll/程序运行的所有变量)
堆栈(值类型):
托管堆(引用类型): CLR初始化进程时,为进程保留的一个进程地址空间区域,用于存储和管理对象,受
圾收集器的控制和管理!
作者:
傅涌钦
时间:
2012-1-3 18:09
个人整理和总结如下:
先从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)而堆和栈的问题的理解主要是为了解释参数传递问题!如:按值传递不会改变形参值,而按址传递会改变行参的值的我问题!
我上次不是发了个附件给你!讲的就是给这个问题!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2