c++内存面试笔记
内存分成5个区:堆、栈、全局/静态存储区、自由存储区、常量存储区
什么是内存泄露?
简单地说就是申请了一块内存空间,使用完毕后没有释放掉。(1)new和malloc申请资源使用后,没有用delete和free释放;(2)子类继承父类时,父类析构函数不是虚函数。(3)Windows句柄资源使用后没有释放。
程序启动的过程:
- 操作系统首先创建相应的进程并分配私有的进程空间,然后操作系统的加载器负责把可执行文件的数据段和代码段映射到进程的虚拟内存空间中。
- 加载器读入可执行程序的导入符号表,根据这些符号表可以查找出该可执行程序的所有依赖的动态链接库。
- 加载器针对该程序的每一个动态链接库调用LoadLibrary
(1)查找对应的动态库文件,加载器为该动态链接库确定一个合适的基地址。
(2)加载器读取该动态链接库的导入符号表和导出符号表,比较应用程序要求的导入符号是否匹配该库的导出符号。
(3)针对该库的导入符号表,查找对应的依赖的动态链接库,如有跳转,则跳到3
(4)调用该动态链接库的初始化函数 - 初始化应用程序的全局变量,对于全局对象自动调用构造函数。
- 进入应用程序入口点函数开始执行。
虚拟内存:在程序内存不够用时,将不常用的物理内存页转移到其他存储设备上,如磁盘,这就是虚拟内存
页表:存放逻辑地址(虚拟地址)与物理地址之间的映射关系
字节对齐满足的条件:
- 内存起始地址要是数据类型的整数倍,
- 占用的内存空间大小需要是结构体中占用最大内存空间的类型的整数倍。