C#中关于堆和栈的个人理解
一、解释
栈(Stack)是编译期间就分配好的内存空间
堆(Heap)是程序运行期间动态分配的内存空间
二、区别
栈通常保存着我们代码执行的步骤:如AddFive()方法,int pValue变量
堆上存放的则多是对象,数据等。
栈不用自己管理,也不归GC管理,当顶元素使用完毕后,自动释放
堆受GC管理,被GC清理
值类型的数据存储在内存的栈中;引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的
内存的分配和销毁
当一个类的实例对象创建的时候,这个对象的不同成员按类别被分配到了不同的内存区域,值类型和引用类型的指针被分配到了栈上,引用类型的实例对象被分配到了托管堆上,静态成员被分配到了全局数据区。此时栈上的指针会指向堆上的对象。当对象使用完以后,引用和实际对象的联系就会断开,从而从而使对象冬眠。因为栈具有自我维护性,它的内存管理可以通过操作系统来完成,而此时堆上的冬眠对象就需要通过垃圾回收器(GC)使用一定的算法来进行回收,释放对象所占据的内存。