申请方式:

栈(stack)是由操作系统自动分配的,如果剩余的空间足够,则分配成功,否则失败;栈由上到下生长,也就是说栈底在高地址处且始终报纸不变,而栈顶则根据使用情况不断变动,且栈的最大使用空间是系统早就预定好的(一般较小,不超过10M),一旦超出这个空间,那么发生栈溢出,会导致程序崩溃。

堆:是由程序员自己来管理的,且可分配的空间极大,一般来说,有多大的内存,就可以分配多大的堆空间;堆自下而上生长的,使用堆申请的内存时,要及时地释放,否则会造成内存泄漏,最后的结果就是程序崩溃。


各自的特点:

在空间连续性上,栈区的空间是连续的;但堆的空间是不连续的。

在分配效率上,栈由操作系统分配,效率高;堆是主动申请,效率低

在存放的内容方面:栈中存放的是局部变量,函数的参数;堆中存放的内容由程序员控制。


特别拎出来一个问题,即堆的空间是不连续的,那么我们该如何寻找这些分散的空间,从而将其分配出去呢?

首先,我们需要了解到,操作系统通过一个类似于链表的东西管理着内存块,链表中的每个结点就是一块空闲的空间,当我们去向堆区申请空间时,操作系统会将链表中第一个符合条件(大于所申请内存)的内存块给我们,然后将这个链表节点从链表中除去,但是还有外附操作,将这块被申请的内存的首地址里面存放整块空间的大小(大小为我们所申请的),便于管理,然后剩下的空间就被切割开来,作为一块新的空间加入链表中。

每天一点C++知识,和你一起共赴未来 ——2022.3.6