C++内存管理(new、delete、operator new、operator delete、定位new)

1.new和delete使用

①new单个和多个变量

1.new开辟空间—内置类型

	int *pa = new int; //开辟一个变量的空间
	//int *pa = new int(10); 允许申请一单元内存时初始化
	int *pb = new int[10]; //开辟多个变量的空间
	//申请多个内存时不允许初始化

2.new开辟空间—自定义类型

class Date
{
    
    
public:
	Date(int year = 2000, int month = 1, int day =1)
		:_year(year)
		, _month(month)
		, _day(day)
	{
    
    }

private:
	int _year;
	int _month;
	int _day;
};
int main()
{
    
    
	Date *pa = new Date;//这样定义前提是有默认构造函数
	Date *pb = new Date();//这样前提是有默认构造函数
	Date *pc = new Date(2020,2,2);//三种定义方式都是可以的
	//定义多个对象
	Date *pd = new Date[10]; //只能有这一种定义方式,
							//且定义多个对象时,类必须要有默认构造函数(不需要传参数)

}

3.注意:
new :开辟单个对象的空间。
new Date[n] :开辟多个对象的空间。
4.new和malloc异同点
相同点:都是开辟一段一定大小的空间,返回一个指针。
不同点:
1.malloc是函数,new是运算符。
2.开辟自定义类型的空间时,new会调用类的构造函数将空间初始化,malloc不会。对于内置类型,new和malloc作用相同。
3.内存开辟成功后malloc返回指针是(void*)类型,new 表达式返回的指针直接是对应类型的指针。

②delete

Date *pa = new Date;//这样定义前提是有默认构造函数
	Date *pb = new Date();//这样前提是有默认构造函数
	Date *pc = new Date(2020,2,2);//三种定义方式都是可以的

	delete pa;
	delete pb;
	delete pc;

	
	//定义多个对象
	Date *pd = new Date[10]; //只能有这一种定义方式,
							//且定义多个对象时,类必须要有默认构造函数(不需要传参数)
	delete[] pd; //释放多个指向多个对象空间指针时必须加[]。

注意事项:
1.delete :释放单个对象内存。
2.delete[]:释放多个对象内存。

delete和 free不同点:
1.delete先调用析构函数,再释放空间。
2.free直接释放空间。

2.new和delete底层原理—operator new和operator delete。

operator new和operator delete是均是函数。

①new、operator new 和 malloc关系

1.new = operator new + 构造函数初始化。
2.operator new 和 malloc作用都是开辟一段空间。不同地方时,当内存开辟失败时malloc是返回NULL指针,而operator new是抛异常。

②delete、operator delete 和 free关系

1.delete = 析构函数 + operator delete。
2.operator delete 和 free都是调用 _free_dbg( pUserData, pHead->nBlockUse ) 这个函数释放空间。

3.定位new用法

作用:再已申请的初始对象内存处调用调用对象的构造函数初始化对象。
new(对象指针)对象类型(初始化列表)

	Date *pd = (Date*)malloc(sizeof(Date));
	new(pd)Date(2020, 2, 2);

猜你喜欢

转载自blog.csdn.net/weixin_50168448/article/details/114679110
今日推荐