/*** @poject * @author jUicE_g2R(qq:3406291309)* @file 底层内存分配:栈区(Stack)与堆区(Heap)* * @language C/C++* @EDA Base on MVS2022* @editor Obsidian(黑曜石笔记软件)* * @copyright 2023* @COPYRIGHT 原创学习笔记:转载需获得博主本人同意,且需标明转载源*/
程序的内存分配
-
由 开发者手动 分配内存
堆区(Heap) -
由 编译器自动 分配内存
栈区(Stack)
全局区(静态区)(Static)
代码区(Text)
常量区
文章目录
- 1 栈区(Stack)
- 1-1 存放
- 1-2 存入操作
- 1-3 Stack中变量的生命周期
- 1-4 分配
- 2 堆区(Heap)
- 2-1 手动分配
- 2-2 (最好是)手动销毁
- 2-3 分配
1 栈区(Stack)
1-1 存放
- 存放的是 “暂时” 的变量
函数的形参与返回值,函数内定义产生的局部变量。
1-2 存入操作
- 类似于 栈 这种数据类型
存入栈区的变量有个典型的特点是 先进后出(现象:压栈),递归函数 正是利用这一特点实现递归的。
1-3 Stack中变量的生命周期
- 栈区变量的生命周期取决于 其变量自身的作用域
在对应函数的调用期间,编译器对这类数据在这段时间自动进行 开辟、回收内存操作。
1-4 分配
- 栈区 向低地址拓展(向下),是连续的内存区域
- 注:虽然是分配动态的,但是这种数据分配形式是不灵活的(局部变量在函数执行完就被编译器直接清除了,万一我不想你编译器清除呢?),且栈区的大小也是有限的(空间大小一般是2M)。
2 堆区(Heap)
- 一般存放指针(注:一定不是野指针)
2-1 手动分配
//.c
p = (DataType* )malloc(sizeof(DataType));//DataType=int,double...
//.cpp
DataType* p1 = (DataType* )malloc(sizeof(DataType));DataType=int,double...
DataType* p2 = new DataType;//DataType=int,double,ClassName(StructName)...
2-2 (最好是)手动销毁
- 不手动销毁可能存在内存泄漏的缺陷
//.c
free(p);
- 最好是配对的
m a l l o c malloc malloc 与 f r e e free free
n e w new new 与 d e l e t e delete delete
//.cpp
free(p1);
delete(p2);
2-3 分配
- 1、堆区 向高地址扩展(向上),是不连续的内存区域。是由系统用 链表 存储
- 2、比栈区分配慢
- 3、灵活,但存在 内存泄漏 的可能