堆和栈是我们在开发的过程中经常遇到的概念,也是最容易搞混和糊涂的概念,这两天下决心经过查资料问人,终于把堆和栈的概念搞的清清楚楚了,下面是网上一位广东的大哥给我的解释,再次感谢,我觉得这个解释很精炼了,但是有一点小问题
堆和栈的第一个区别就是申请方式不同:栈(英文名称是stack)是系统自动分配空间的( 准 确 的 说 加 粗 的 这 句 话 时 错 误 的 , 下 面 解 释 \color{RED}{准确的说加粗的这句话时错误的,下面解释} 准确的说加粗的这句话时错误的,下面解释),例如我们定义一个 char a;系统会自动在栈上为其开辟空间。
而堆(英文名称是heap)则是程序员根据需要自己申请的空间,例如malloc(10);开辟十个字节的空间。由于栈上的空间是自动分配自动回收的,所以栈上的数据的生存周期只是在函数的运行过程中,运行后就释放掉,不可以再访问。而堆上的数据只要程序员不释放空间,就一直可以访问到,不过缺点是一旦忘记释放会造成内存泄露。
上面这段话的加粗字体的主要问题是:栈的空间到底是谁分配的,其实不是系统分配的,而是编译器在编译的时候就已经分配好了所有的栈空间,下载到系统里的执行,系统不过是按照编译分配的栈执行,所以准确的说栈是编译器分配的
记录一个概念:
内存泄漏(Memory Leak)
是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
内存泄漏缺陷具有隐蔽性、积累性的特征,比其他内存非法访问错误更难检测。因为内存泄漏的产生原因是内存块未被释放,属于遗漏型缺陷而不是过错型缺陷。此外,内存泄漏通常不会直接产生可观察的错误症状,而是逐渐积累,降低系统整体性能,极端的情况下可能使系统崩溃。