heap和stack的差别

在进行C/C++编程时,需要程序员对内存的了解比较精确。经常需要操作的内存可分为一下几个类别:

  • 栈区(stack):由编译器自动分配和释放,存放函数的参数值、局部变量的值等。其操作方式类似于数据结构中的栈;
  • 堆区(heap):一般有程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表;
  • 全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放;
  • 文字常量区:常量字符串就是放在这里的。程序结束后由系统释放;
  • 程序代码区:存放函数体的二进制代码

PS:
每个进程在执行的时候,内核都会给其分配一块内存,称为进程地址空间。
这里面除了固定的代码段(存放代码)、数据段、常量段、bss段等,其他的部分会被堆和栈进行共享

栈部分主要负责保存进程的运行上下文,比如函数调用的参数、返回值,包括上一级的函数入口等等;同时函数中定义的临时变量(auto变量)也保存在栈空间中。当函数结束返回的时候,相应的变量也就失效

堆则主要用于动态内存分配,比如malloc,就是从堆中进行分配内存(当然也可以指定从栈中分配,但是一般比较少见)。从堆中动态分配的内存有个特点,其需要程序主动去释放内存,比如free,如果不进行释放,则会造成内存泄露

发布了47 篇原创文章 · 获赞 0 · 访问量 2万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章