C++ --- new和delete

一.动态内存管理new 和 delete

        我们需要动态开辟内存空间,c语言提供了库函数 malloc() free() 这两个函数来分配和释放空间,但是使用malloc()函数的条件是得计算出需要申请的内存空间的大小。我们想申请一个内存块,存放一个struct结构体对象。我们就得计算出结构体对象大小。

        c++库就提供了new运算符来简化开辟空间的步骤。

a.使用方法:

1.new 类型;----- 动态申请一个内存块,内存的大小是“类型”占用的字节数。成功,返回申请到内存块的首地址,失败,返回NULL空指针。

	int* p1 = new int;
	delete p1;

2.new 类型(初始值); ----- 动态申请一个内存块,内存的大小是“类型”占用的字节数,内存块存放初始值。成功,返回申请到内存块的首地址,失败,返回NULL空指针。

	int* p1 = new int(5);
	delete p1;

3.new 类型[数组大小]; ----- 申请一个内存块,内存块是一个数组。成功,返回申请到内存块的首地址,失败,返回NULL空指针。

	int* p1 = new int[5];
	delete []p1;  //数组要用[]

初始化:

	int* arr1 = new int[10] {};   //每个元素是随机值
	int* arr2 = new int[10]();	 //每个元素都是0
	int* arr3= new int[10] {5, 5, 5, 5, 5, 5, 5, 5, 5, 5};  //10个5
	int* arr4 = new int[10] {5, 4, 3};   //5,4,3,剩下7个0

new 和delete 操作自定义类型

class Date
{
public:
	Date(int year = 2024, int month = 5, int day = 17)// 构造函数
	{
		_year = year;
		_month = month;
		_day = day;
	}
	~Date()   //析构函数
	{
		_year = 0;
		_month = 0;
		_day = 0;
	}
	void Print()
	{
		cout << _year << "年" << _month << "月" << _day << "日" << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date* p1 = new Date;
	delete(p1);
	return 0;
}

在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数

b.原理:

内置类型:

        new/delete和malloc/free基本类似,不同的是,new/delete申请释放的是单个元素的空间,new[ ]/delete [ ]申请释放的是连续的空间,此外,malloc申请失败会返回NULL,而new申请失败会抛异常。

自定义类型:

new的原理
     1. 调用operator new函数申请空间
     2. 在申请的空间上执行构造函数,完成对象的构造
delete的原理
     1. 在空间上执行析构函数,完成对象中资源的清理工作
     2. 调用operator delete函数释放对象的空间
new T[N]的原理
     1. 调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对
象空间的申请
     2. 在申请的空间上执行N次构造函数
delete[]的原理
     1. 在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理
     2. 调用operator delete[]释放空间,实际在operator delete[]中调用operator delete来释
放空间

二.operator new与operator delete函数

operator new 封装的是malloc,operator delete 封装的是free。

new在底层调用operator new全局函数来申请空间,delect在底层通过operator delete 全局函数来释放空间。

三.malloc/free 和new/delete的区别

相同点:

都从堆上开辟空间,再手动释放。

不同点:

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


   

  • 27
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值