每次忘了都要去翻查书,麻烦死了。
Stack(堆栈,也就是栈),存的就是单纯的数值类型和类的引用名称
.net有个托管堆managed heap也叫heap,存的是类实例等
为啥叫managed heap呢?因为还有个叫垃圾收集器的东西,所以此heap不同于彼heap。为啥这样说?
因为,假设有abcde5份连续的内存存在managed heap中,然后 b 和 d 都被释放了,传统heap就保持原样,下次分配内存的时候系统需要找到一个适合新东西放的空间。但是自从有了垃圾收集器之后,b和d一被释放,垃圾收集器就来做善后工作了,它吧c调到a后面,再把e调到c后面,所以ace又是连续的内存而b,d所释放的内存被放到了后面。
本说法出自《C#高级编程第4版》,英文版叫 《Professional C# 2005》。推荐看英文版,或是时间充足的话对照着看。中文版有些直译式中文,理解起来还不如直接看英文好。
补:自己对C,C++内存上问题的理解
你 int 一个 a,就在栈中分配了一个名称为a的空间
int b,就接着a分配了b的空间
普通值类型的分配都是连续的,都放在栈里,所以,程序结束后,内存是先释放b的空间,再释放a的空间,b没销毁,a永远在,这就是栈stack(也叫堆栈),先进后出。
普通的堆,则在一列内存空间中选择能放下的放东西,它想进就进,用完就销毁。有人叫它先进先出,但是不准确。因为进去之后,不用它的时候就销毁,但是如果还在用,它就还在,跟别的内存块的产生于销毁没有直接关系。为啥说它性能不如栈?因为查找新空间需要消耗时间。
为啥说指针危险,因为无论是栈或是堆里面放的东西,你指着指着就跳没了,刚才的地址上的数据还在,就会出现资源回收的问题。
指针会出的资源溢出就是在于,空间没释放,内存会一直占用着,会出现几个问题:
1.栈满了,你再放的东西太大,肯定溢出。
2.越界问题,取到了垃圾数据会使程序连锁反应般地胡乱计算。
2.内存无休止增加,系统崩溃。