说起会了解这个东西,还是比较尴尬的,在学校里面老师一般不会讲解C++的堆和栈,大多数人了解的堆和栈是数据结构里面的概念,而这里一般面试官想问的是C++的内存分区管理方式。

首先说明,在C++中,内存分为5个区:堆、占、自由存储区、全局/静态存储区、常量存储区

栈:是由编译器在需要时自动分配,不需要时自动清除的变量存储区。通常存放局部变量、函数参数等。堆:是由new分配的内存块,由程序员释放(编译器不管),一般一个new与一个delete对应,一个new[]与一个delete[]对应。如果程序员没有释放掉,        资源将由操作系统在程序结束后自动回收。自由存储区:是由malloc等分配的内存块,和堆十分相似,用free来释放。全局/静态存储区:全局变量和静态变量被分配到同一块内存中(在C语言中,全局变量又分为初始化的和未初始化的,C++中没有这一区分)。常量存储区:这是一块特殊存储区,里边存放常量,不允许修改。(注意:堆和自由存储区其实不过是同一块区域(这句话是有问题的,下文解释),new底层实现代码中调用了malloc,new可以看成是malloc智能化的高级版本,详情参见new和malloc的区别及实现方法,  以及 这一篇)
 

疑问一:堆和自由存储区是不是同一块区域

自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配,C语言使用malloc从堆上分配内存,使用free释放已分配的对应内存。自由存储区不等于堆,如上所述,布局new就可以不位于堆中


疑问二:堆和栈的区别

栈和堆的区别
 
 
使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。
 

相关文章:

  • 2021-10-24
  • 2022-12-23
  • 2021-09-14
猜你喜欢
  • 2021-06-09
  • 2022-12-23
  • 2022-03-08
  • 2022-12-23
  • 2021-12-26
  • 2022-12-23
  • 2022-01-19
相关资源
相似解决方案