C&C++内存分布
C/C++中的程序内存区域划分如图:
栈又名堆栈,非静态局部变量、函数参数、返回值等存放在栈上,栈向下增长
内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库,用于进程间通信
堆用于程序运行时动态内存分配,向上增长
数据段存储全局数据和静态数据
代码段是可执行的代码和只读常量
C语言内存管理
- 1.malloc/calloc/realloc和free
malloc开辟空间
calloc完成初始化
realloc扩容,当原空间足够时,在原空间之后继续开辟相应大小的空间,若原空间不够时寻找新的足够大小的空间然后将原来的数据复制到新空间,释放原有空间。
C++内存管理
- 1.new/delete操作内置类型
malloc 和 new 一样
- 2.new和delete操作自定义类型
malloc 开辟
new 开辟空间并调用构造函数初始化
数组:初始化注意构造函数
delete: 调用析构函数并释放空间
-
operator new与operator delete函数
- new和delete是用户进行动态内存申请和释放的操作符,operator new 和operator delete是系统提供的全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间
operator new == 封装了(malloc + 失败抛异常)
operator delete == free -
new和delete的实现原理
- 1.内置类型
- new int ==》operator new 开空间 ==》malloc ==》构造(内置类型也存在构造函数 int i(10);)
- malloc int ==》 malloc
- 2.自定义类型
- new Test ==》operator new 开空间 ==》malloc ==》构造
- malloc Test ==》 malloc
- 1.内置类型
-
定位new表达式(placement-new)
- 定位new表达式在实际中一般是配合内存池使用。因为内存池分配出的内存没有初始化,所以如果是自定义类型的对象,需要使用new的定义表达式进行显示调构造函数进行初始化。
内存泄漏
- 内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。主要是由于内存申请了忘记释放以及异常安全问题 。针对内存泄漏问题做好事前预防以及事后查错,避免此类问题。