0%

C++内存管理及栈、堆区别

C++内存分区

  • 栈:存放函数的局部变量、函数参数、返回地址等,由编译器自动分配
  • 堆:动态申请的内存空间,就是由malloc分配的内存块,由程序员控制它的分配和释放,如果程序结束还没有释放,操作系统会自动回收
  • 全局区/静态存储区(.bss段和.data段):存放全局变量和静态变量,程序运行结束操作系统自动释放
  • 常量存储区:存放的是常量,不允许修改,程序运行结束自动释放
  • 代码区:存放代码,不允许修改,但可以执行。编译后的二进制文件存放在这里

栈和堆的区别

  • 申请方式:栈是系统自动分配,堆是程序员主动申请
  • 申请后系统响应:分配栈空间,如果剩余空间大于申请空间则分配成功,否则分配失败栈溢出;申请堆空间,堆在内存中呈现方式类似于链表(记录空闲地址空间的链表),在链表上寻找第一个大于申请空间的节点分配给程序,将该节点从链表中删除,大多数系统中该块空间的首地址存放的是本次分配空间的大小,便于释放,将该块空间上的剩余空间再次连接在空闲链表上。
  • 栈在内存中是连续的一块空间(向低地址扩展)最大容量是系统预定好的,堆在内存中的空间(向高地址扩展)是不连续的。
  • 申请效率:栈是由系统自动分配,申请效率高,但程序员无法控制;堆是由程序员自己来申请的,效率低,容易产生碎片。
  • 存放的内容:栈中存放的是局部变量,函数的参数;堆中存放的内容由程序员控制。