【C/C++底层】内存分配:栈区(Stack)与堆区(Heap)

/**
 * @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、灵活,但存在 内存泄漏 的可能
  • 9
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值