“栈和堆”


友友们,上一篇,我们讲述了动态内存的组成和运用这一期重点来讲一下其中的两个结构栈(stack)和堆(heap)的区别与作用。

其实,从上一篇的简单介绍中,我们可以得知,栈是由计算机自动分配内存以及自动删除分配的,而堆则是由程序员手动调用的,这便是两者之间最本质区别,其余两者之间一切的不同都是由这一点来引出的,那么下面让我们来分别详细的阐释这两个不同的储存区域。

先说说栈(stack)

栈(stack)是由计算机自动分配的一块内存区域,而既然是由计算机自动控制的,也就注定它遵守着各种各样的规则。事实上,当你每创建一个函数,都会在栈区那里来创建一个栈帧,而每一个你所定义的局部变量都只可以在这个函数对应的栈帧之内使用,也就是说每一个函数的局部变量,它的存活期只在其对应的栈帧之内。
下面我们举一个例子来进行说明,比如说你在main函数中调用了SOE函数,那么,当程序运行到main中调用SOE函数这一步时,main函数的栈帧会暂停,它就会自动跳转到main之上的SOE的栈帧运行,在SOE 完成之后,再跳回到原来的main函数继续进行,如图所示

其实在图中,大家除了要看出来不同的局部变量的存活范围,还应该知道看似你在主函数中调用了其他一个函数,并将主函数中的一个值导入,但实际上只不过是将主函数的一个局部变量映射到了被调函数当中。哪怕他们的名称还有值一模一样,存活期的不同就决定了它们注定是两个完全不同的,没有任何关联的局部变量,其实关于这一点,大家可以在具体的函数的传值和传引用这两个用法之中看出来,有关这两个用法就抽空再说吧(摆!)。
最后再补充十分重要的一点:栈溢出。上面已经不止一次的提过栈是由计算机自动控制的,故它的内存大小是有限的,一般为1mb,而一旦在栈中所储存着各种变量超出了这个范围,就会直接引起程序崩溃!这可是连职业程序员也需要万分谨慎的地方。

再说说堆(heap)

堆是由程序员所自由支配的,它与栈之间的不同,其实就像是汽车的手动挡和自动挡。由于是程序员所操控,便多了几分灵活性,同时也少去了计算机控制的便捷性。
使用堆的过程其实就类似于向计算机申请一个明确大小和格式的内存,在这一过程中,便需要用到函数。在c中为malloc和free,在c++中则多了new和delete。由于C++可以看作是c的超集,所以实际上new和malloc相似,delete和free相似,具体格式如下

1
2
3
4
5
6
7
#include <stdio.h>
int main ()
{
int p=(int)malloc(int);
free p;
return 0
}

由于堆的大小相比下没有上限(取决于你计算机的配置)这里其实只需要担心一点,内存泄露,即有始无终:只用malloc申请了内存却没有用free释放,那么所申请的内存将一直存在,一直占用宝贵的内存资源,造成程序运行时占用的垃圾内存不断累积(你可以试着打开任务管理器看看一个没有释放内存的程序重复运行的内存占用的暴涨)。注意到这个,基本上就可以灵活运用堆了。

好了友友们,终于写完了,累死我了⊙﹏⊙


文章作者: 耀韬
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 耀韬 !
  目录