C++面试突破---C++内存

1.内存分区

  • :存放函数的局部变量、函数参数、返回地址等,由编译器自动分配和释放。
  • :动态申请的内存空间,就是由 malloc 分配的内存块,由程序员控制它的分配和释放,如果程序执行结束还没有释放,操作系统会自动回收。
  • 全局区/静态存储区(.bss 段和 .data 段) :存放全局变量和静态变量,程序运行结束操作系统自动释放。(在 C 语言中,未初始化的放在.bss 段中,初始化的放在 .data 段中,C++ 中不再区分了。)
  • 代码区(.text 段):存放代码,不允许修改,但可以执行。编译后的二进制文件存放在这里。

2.堆与栈

栈上的变量⽣命周期与其所在函数的执⾏周期相同,由操作系统自动分配释放,堆上的变量⽣命周期由程序员申请(new或malloc)和释放(delete或free)。

栈上的内存分配和释放是⾃动的,速度较快。
堆上的内存分配和释放需要⼿动操作,速度相对较慢。

3.内存泄漏

内存泄漏是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费。

例如:堆空间、套接字、文件描述符

解决方法:智能指针 && 细心

4.内存对齐

内存对齐应用于三种数据类型中:struct / class / union

内存对齐4原则:

  1. 数据成员对齐规则:结构(struct)或联合(union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小的整数倍开始。
  2. 结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部"最宽基本类型成员"的整数倍地址开始存储。(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储)。
  3. 收尾补齐:结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的"最宽基本类型成员"的整数倍。不足的要补齐。(基本类型不包括struct/class/uinon)。
  4. sizeof(union),以结构里面size最大元素为union的size,因为在某一时刻,union只有一个成员真正存储于该地址。
相关推荐
没有bug.的程序员6 分钟前
JVM 总览与运行原理:深入Java虚拟机的核心引擎
java·jvm·python·虚拟机
甄超锋31 分钟前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat
cui__OaO1 小时前
Linux软件编程--线程
linux·开发语言·线程·互斥锁·死锁·信号量·嵌入式学习
星星火柴9361 小时前
关于“双指针法“的总结
数据结构·c++·笔记·学习·算法
阿华的代码王国1 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
Zyy~1 小时前
《设计模式》装饰模式
java·设计模式
A尘埃1 小时前
企业级Java项目和大模型结合场景(智能客服系统:电商、金融、政务、企业)
java·金融·政务·智能客服系统
鱼鱼说测试1 小时前
Jenkins+Python自动化持续集成详细教程
开发语言·servlet·php
青云交1 小时前
Java 大视界 -- 基于 Java 的大数据可视化在城市交通拥堵治理与出行效率提升中的应用(398)
java·大数据·flink·大数据可视化·拥堵预测·城市交通治理·实时热力图
艾莉丝努力练剑2 小时前
【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)
c语言·开发语言·数据结构·c++·学习·算法