文章目录
- Ⅰ C++ 内存分布
- Ⅱ C++ 内存管理方式
-
- 1. new 和 delete 操作内置类型
- 2. new 和 delete 操作自定义类型
- Ⅲ operator new 和 operator delete
- Ⅳ new 和 delete 的实现原理
-
- Ⅴ malloc / free 和 new / delete 的区别
Ⅰ C++ 内存分布
C++ 中程序内存区域划分
内存区域 |
说明 |
内核空间 |
用户代码不能读写 |
栈 |
向下增长 ↓,存储定义在函数内的局部变量 |
内存映射段 |
文件映射、动态库、匿名映射 |
堆 |
向上增长 ↑,用于存储动态开辟出来的空间 |
数据段 |
也叫静态区,用于存包处全局数据、静态数据 |
代码段 |
存储可执行代码 / 只读常量 |
Ⅱ C++ 内存管理方式
- C++ 中通过 new 和 delete 操作符来替代 C语言 中 malloc 和 free 的功能。
1. new 和 delete 操作内置类型
1. new 和 delete 操作内置类型格式
内置类型* 对象名 = new 内置类型;
delete 对象名;
内置类型* 对象名 = new 内置类型(你要 new 出来的数量);
delete[] 对象名;
2. new 和 delete 操作内置类型示例
- 这里主要采用 int 类型作为演示,其他 C++ 内置的数据类型也可以这么整。
2. new 和 delete 操作自定义类型
- 在申请自定义类型的空间时,new 会调用构造函数,delete 会调用析构函数。
1. new 和 delete 操作自定义类型格式
自定义类型名* 对象名 = new 自定义类型名(传给构造函数的参数);
delete 对象名;
自定义类型名* 对象名 = new 自定义类型名[创建对象的数量];
delete[] 对象名;
2. new 和 delete 操作自定义类型示例
class date
{
public:
date(int year = 1, int month = 1, int day = 1)
:_year(year)
,_month(month)
,_day(day)
{
cout << "这是一个构造函数" << endl;
}
~date()
{
cout << "这是一个析构函数" << endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
date* d1 = new date;
date* d2 = new date(2024,2, 9);
date* d3 = new date[3];
delete d1;
delete d2;
delete[] d3;
return 0;
}
Ⅲ operator new 和 operator delete
概念
- operator new 和 operator delete 是全局函数,不是对 new 和 delete 的重载。
- new 在底层调用 operator new 函数申请空间,delete 则调用 operator delete 函数释放空间。
- operator new 是对 malloc 的封装,operator delete 是对 free 的封装。
本质
- operator new 实际上是通过 malloc 来申请空间,如果 malloc 申请空间成功就直接返回,否则执行用户提供的空间不足应对措施,如果用户提供该措施就继续申请,否则就抛异常。
- operator delete 实际上是通过 free 来释放空间 。
Ⅳ new 和 delete 的实现原理
1. 内置数据类型
- 如果申请的是内置类型的空间,new 和 malloc,delete 和 free 基本类似。
- 不同的地方是 new / delete 申请和释放的是单个元素的空间,new [] 和 delete[] 申请和释放的是连续的空间。
- new 在申请空间失败时会抛出异常,而 malloc 是返回 NULL。
2. 自定义数据类型
1. new 和 delete 的原理
- new:先调用 operator new 函数申请空间,再在申请的空间上执行构造函数。
- delete:先在空间上执行析构函数,完成对象中资源的清理工作。再调用 operator delete 函数去释放对象的空间。
2. new T[n] 和 delete[] 的原理
- new T[n]:先调用 operator new[] 函数,在 operator new[] 函数中调用 operator new 函数完成对 n 个对象空间的申请。最后在申请的空间上执行 n 次构造函数。
- delete[]:先在释放的对象空间上执行 n 次析构函数。再调用 operator delete[] 释放空间,实际是在 operator delete[] 中调用 operator delete 来释放空间。
Ⅴ malloc / free 和 new / delete 的区别
1. 共同点
2. 不同点
- malloc 和 free 是函数,而 new 和 delete 是操作符。
- malloc 申请的空间不会被初始化,new 可以初始化申请的空间。
- malloc 申请空间时,还需要手动计算空间的大小并传递给 malloc 函数。new 只需要在后面跟上该对象的类型即可,如果要 new 多个对象,只需在 [] 中指定对象个数即可。
- malloc 的返回值为 void*,在使用时必须要进行强转。而 new 因为后面跟着该空间的类型,因此不需要对返回值进行强转。
- malloc 需要手动检查是否开辟空间失败。new 失败了是抛异常,不需要手动检查。
- 申请自定义类型对象时,malloc / free只会开辟空间。而 new 在申请空间后会调用构造函数完成对象的初始化,delete 在释放空间前会调用析构函数。