堆堆堆,栈栈栈(.net)

每次忘了都要去翻查书,麻烦死了。

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.内存无休止增加,系统崩溃。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值