C++内存管理
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);