当前位置: 首页 > news >正文

【C++ 内存管理】静态分配和动态分配

文章目录

      • 1.静态分配
      • 2.动态分配
      • 3.对静态分配和动态分配理解
      • 4.析构函数调用顺序
      • 5.new[ ] 为什么会多申请内存呢?

1.静态分配

  • 定义:
    编译阶段确定内存大小和生命周期,由编译器自动分配和释放。

  • 特点:
    分配时机:程序启动时分配,程序结束时释放。
    内存区域:数据段(全局变量或者静态变量)和栈区。
    生命周期:与程序或模块的执行周期一致。
    大小固定:内存大小在编译时已知,不可动态调整。
    无需手动管理:由编译器自动释放。

2.动态分配

  • 定义:
    程序运行阶段动态分配内存,由程序员显示控制。

  • 特点:
    分配时机:运行时动态申请(如 malloc, new)和释放(如 free, delete)。
    内存区域:堆区或者栈区(栈可以通过函数_alloca进行动态分配,不过注意,所分配空间不能通过free或delete进行释放)。
    生命周期:由程序员显示控制。
    大小可变:内存大小在运行时确定,可动态调整(如 realloc)。
    需要手动管理:需显式释放内存。

3.对静态分配和动态分配理解

  • 题目一:C++中关于堆和栈的说法,哪个是错误的:( C )
    在这里插入图片描述

4.析构函数调用顺序

  • 题目二:设已经有A,B,C,D4个类的定义,程序中A,B,C,D析构函数调用顺序为? (A—> B—> D—> C )
    解析:先显示调用的delete pa,所以pa先析构,然后我们再观察有无局部变量,局部变量的析构顺序是先声明的后析构只有一个局部变量b析构,最后查看静态变量和全局变量,同样要遵守先声明的后析构,所以d先析构,最后再析构c。
C c;
void main()
{

  A*pa=new A();

  B b;

  static D d;

  delete pa;
}

5.new[ ] 为什么会多申请内存呢?

在这里插入图片描述

使用 new A 时,编译器需记录‌元素个数‌,以便 delete[] 能正确调用每个元素的析构函数‌。编译器在数组内存块‌头部多分配4字节‌(32位系统)或8字节(64位系统),用于存储元素数量。
在这里插入图片描述

对于内置类型,delete[] 释放 char 数组时,‌无需调用析构函数‌,仅需释放内存‌。所以不需要多开内存来存储元素数量。
在这里插入图片描述

相关文章:

  • 在android实现Google的web登录
  • 自动驾驶数据闭环中的MLOps实践:Kubernetes、Kubeflow与PyTorch的协同应用
  • 电能质量在线监测分析装置支持实时监测、数据存储及远程传输,适用于电网、工业等场景
  • C语言练习二 进制转换
  • Shell脚本编程
  • MQTT:深入剖析 paho.mqtt.embedded - c - master 目录结构
  • AcWing 6099. 座位
  • 【网络安全】Linux 命令大全
  • 粒子系统优化完成
  • OpenHarmony如何编译安装系统应用(以settings设置为例)
  • 项目1笔记
  • 如何在 Excel 中处理并拆分你提供的这种混合单位的库存数据。
  • 【1】k8s集群管理系列--包应用管理器之helm
  • Makefile:超简单快速入门(go示例)
  • 京东与喜茶关系破裂:切断所有合作 禁止进入办公场所
  • 安全是基石
  • http页面的加载过程
  • 富士相机照片 RAF 格式如何快速批量转为 JPG 格式教程
  • HarmonyOS:HMPermission权限请求框架
  • 宁德时代25年春招笔试演绎数字推理SHL测评题库
  • 自主建设公司网站/网络软文推广网站
  • 柳市网站制作/seo优化方案报价
  • 阿里巴巴b2b商业模式分析/seo文章
  • 网站建设目的分析/虎扑体育网体育
  • 电子手表网站/seo课程培训入门
  • 做网站贵不贵/seo哪家公司好