【05】C++ 内存管理

文章目录

  • Ⅰ C++ 内存分布
  • Ⅱ C++ 内存管理方式
    • 1. new 和 delete 操作内置类型
    • 2. new 和 delete 操作自定义类型
  • Ⅲ operator new 和 operator delete
  • Ⅳ new 和 delete 的实现原理
    • 1. 内置数据类型
    • 2. 自定义数据类型
  • Ⅴ 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++ 内置的数据类型也可以这么整。

【05】C++ 内存管理_第1张图片

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;			// new 一个日期类东西,并用缺省参数调用构造函数初始化
	date* d2 = new date(2024,2, 9);	// new 一个日期类对象,并用所给的值调用构造函数初始化
	date* d3 = new date[3];			// new 三个日期类对象,并对每个对象使用缺省参数初始化

	delete d1;						// 删除 new 出来的单个对象
	delete d2;
	delete[] d3;					// 删除 new 出来的多个对象
	
	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 函数去释放对象的空间。

【05】C++ 内存管理_第2张图片

2. new T[n] 和 delete[] 的原理

  • new T[n]:先调用 operator new[] 函数,在 operator new[] 函数中调用 operator new 函数完成对 n 个对象空间的申请。最后在申请的空间上执行 n 次构造函数。
  • delete[]:先在释放的对象空间上执行 n 次析构函数。再调用 operator delete[] 释放空间,实际是在 operator delete[] 中调用 operator delete 来释放空间。

【05】C++ 内存管理_第3张图片

Ⅴ malloc / free 和 new / delete 的区别

1. 共同点

  • 都是从堆上申请空间,并且都需要用户主动释放。

2. 不同点

  1. malloc 和 free 是函数,而 new 和 delete 是操作符。
  2. malloc 申请的空间不会被初始化,new 可以初始化申请的空间。
  3. malloc 申请空间时,还需要手动计算空间的大小并传递给 malloc 函数。new 只需要在后面跟上该对象的类型即可,如果要 new 多个对象,只需在 [] 中指定对象个数即可。
  4. malloc 的返回值为 void*,在使用时必须要进行强转。而 new 因为后面跟着该空间的类型,因此不需要对返回值进行强转。
  5. malloc 需要手动检查是否开辟空间失败。new 失败了是抛异常,不需要手动检查。
  6. 申请自定义类型对象时,malloc / free只会开辟空间。而 new 在申请空间后会调用构造函数完成对象的初始化,delete 在释放空间前会调用析构函数。

你可能感兴趣的:(c++,开发语言)