C++中的s内存

资料:CSDN C++堆栈详解

内存的分类标准

C++中有多种内存分类的标准,这里记录了两种,一般三分类标准应该就足够理解大部分程序了。最主要的是需要理解堆(heap)与栈(stack)

三分类

  • 静态(全局)存储区 static
    编译时分配。存储静态数据全局数据以及常量

  • 栈区 stack
    执行函数时,函数参数局部变量函数调用后返回的地址均创建在栈上。函数执行后地址内存自动释放。

  • 堆区 heap
    动态内存分配区。运行时使用malloc/new开辟的内存存储在该区,需要手动free/delete释放。或者在程序结束后自动释放掉动态内存。

五分类


  • 由编译器自动分配释放。通常存储局部变量函数参数以及函数调用后的返回地址

  • 使用new分配的内存存储在堆中,需要手动使用delete释放。程序结束后操作系统也会自动回收。
  • 自由存储区
    使用malloc分配的内存存储在堆中,需要手动使用free释放。
  • 全局/静态存储区
    全局变量静态变量存储在这一内存块中。C语言还区分初始化和未初始化,C++不再区分。
  • 常量存储区
    存储常量,不能被修改。

递归函数与栈

调用函数通常是一个压栈的过程,当函数执行完成则会出栈。
调用一个递归函数通常需要多次递归,这是一个不断压栈的过程,当撞墙返回后则是不停出栈的过程。
因此调用递归函数需要注意如果栈区内存有限则可能发生栈满。

内存栈相关

栈溢出

栈的特性

内存堆相关

堆溢出

堆的特性