跳转至

C++内存

堆和栈的区别

  • 空间分配方式不同
    • 栈由系统自动分配释放
    • 堆由程序员分配释放
  • 缓存方式不同
    • 堆使用二级缓存,速度较慢
    • 栈是一级缓存,调用完毕立即释放,速度块
  • 数据结构不同
    • 堆类似数组结构
    • 栈类似栈结构,先进后出
  • 空间不同
    • 堆获得空间较大
    • 栈获得空间较小

C++内存管理

  • C++内存管理分为5个区,堆,栈,自由存储区,静态存储区,常量存储区
  • 栈:函数内局部变量创建在栈上,函数执行完内存被释放
  • 堆:由new分配的内存块,一个new对应一个delete
  • 自由存储区:由malloc分配的内存块,和堆相似,不同的是由free结束
  • 静态存储区:全局变量和静态变量被分配到同一块内存中
  • 常量存储区:存放的是常量

程序的组成,各部分的作用

  • 组成:(地址从地到高)代码段,数据段,BSS段,堆,共享区,栈
  • 代码段:存放程序执行代码的一块内存区域,只读
  • 数据段:存放已初始化的全局变量和静态变量
  • BSS段:存放未初始化的全局变量和静态变量
  • 堆:动态申请内存,堆从低地址向高地址增长
  • 栈:存放局部变量,函数参数值,从高地址向低地址增长
  • 共享区:位于堆栈之间

内存泄漏

  • 概念:申请一块内存后没有释放
  • 检测方法
    • 使用内存分配函数后记住释放内存
    • 使用智能指针
    • 采用链表方法管理已分配的内存,使用完毕后查改链表
    • 采用工具插件

内存对齐

  • 内存对齐应用于三种数据类型:structclassunion
  • 什么是内存对齐?
    • 结构体是一种复合的数据结构,在结构体中,编译器为结构体的每个成员按其自然边界分配空间,第一个成员的地址和结构体的地址相同,为了使CPU对变量进行快速访问,需要对变量的起始地址进行对齐操作,例如4字节的int类型的起始地址应该在4字节的边界上,即起始地址能被4整除
  • 为什么要内存对齐?
    • 提高CPU访问数据的效率,例如不对齐的情况下,起始位置为Ox000000002访问int变量需要访问两次内存,第一次取Ox00000002-Ox00000003,第二次取Ox00000004-Ox00000004,组合之后才能得到整形数据