个人整理和总结如下:
先从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)而堆和栈的问题的理解主要是为了解释参数传递问题!如:按值传递不会改变形参值,而按址传递会改变行参的值的我问题!
我上次不是发了个附件给你!讲的就是给这个问题! |