无题
C++中的s内存
资料:CSDN C++堆栈详解
内存的分类标准
C++中有多种内存分类的标准,这里记录了两种,一般三分类标准应该就足够理解大部分程序了。最主要的是需要理解堆(heap)与栈(stack)
三分类
-
静态(全局)存储区 static
编译时分配。存储静态数据、全局数据以及常量 -
栈区 stack
执行函数时,函数参数、局部变量、函数调用后返回的地址均创建在栈上。函数执行后地址内存自动释放。 -
堆区 heap
动态内存分配区。运行时使用malloc/new开辟的内存存储在该区,需要手动free/delete释放。或者在程序结束后自动释放掉动态内存。
五分类
- 栈
由编译器自动分配释放。通常存储局部变量,函数参数以及函数调用后的返回地址。 - 堆
使用new分配的内存存储在堆中,需要手动使用delete释放。程序结束后操作系统也会自动回收。 - 自由存储区
使用malloc分配的内存存储在堆中,需要手动使用free释放。 - 全局/静态存储区
全局变量和静态变量存储在这一内存块中。C语言还区分初始化和未初始化,C++不再区分。 - 常量存储区
存储常量,不能被修改。
递归函数与栈
调用函数通常是一个压栈的过程,当函数执行完成则会出栈。
调用一个递归函数通常需要多次递归,这是一个不断压栈的过程,当撞墙返回后则是不停出栈的过程。
因此调用递归函数需要注意如果栈区内存有限则可能发生栈满。
内存栈相关
栈溢出
栈的特性
内存堆相关
堆溢出
堆的特性
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Derek's Blog!