C++ -- 内存管理
C++ --内存管理
- 1. C/C++内存分布
- 2. C中动态内存管理
- 3. C++中动态内存管理
- 4. 面对自定义类型
- 5. operator new和operator delete
- 6. new和delete的实现原理
- 6.1 内置类型
- 6.2 自定义类型
- 7. 定位new(placement new)
- 7.1 底层机制
- 7.2 本质
1. C/C++内存分布
2. C中动态内存管理
C中动态内存管理
3. C++中动态内存管理
区别于C中多样的方式,如malloc、calloc和realloc,以及释放内存的free,C++中常用的动态内存管理方式是new和delete。
使用的方法也很简单
int main()
{int* p1 = new int(4);int* p2 = new int[10] { 1, 2, 3, 4 };// 创建连续空间// 初始化与否取决于你delete p1;delete[] p2;// 释放时最好匹配return 0;
}
new除了用起来方便和malloc用法上没什么区别,不同的是new可以初始化参数而malloc只能手动初始化。
4. 面对自定义类型
在面对自定义类型时,new和delete会自动调用构造函数和析构函数。如果一次性创建了多个自定义类型,创建了几个就会调用几次构造函数和析构函数。
5. operator new和operator delete
new和delete是操作符,operator new和operator delete是操作系统提供的全局函数。new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间。operator new 实际也是通过malloc来申请空间,如果用户提供该措施就继续申请,否则就抛异常。operator delete 最终是通过free来释放空间的。
6. new和delete的实现原理
6.1 内置类型
new和malloc,delete和free基本类似,不同的地方是:new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申请空间失败时会抛异常,malloc会返回NULL。
6.2 自定义类型
new的原理:
先调用operator new开辟空间,再调用构造函数在这块空间上完成构造。
delete的原理:
先调用析构函数释放空间上的资源,再调用free释放这块空间。
7. 定位new(placement new)
定位new是在已开辟的空间上调用构造函数初始化一个对象。核心作用是将对象构造与内存分配解耦,适用于需要精确控制内存布局或优化性能的场景。
7.1 底层机制
与普通new的区别:
定位new跳过operator new开辟空间,直接调用构造函数。
7.2 本质
定位new本质是operator new的重载版本,接受额外参数(地址)。