目录
1. new 和 delete 的基本使用
int main()
{
//内置类型 :开空间+不初始化
int* p1 = new int;
int* p2 = new int[10];
// 开空间+初始化
int* p3 = new int(10);
int* p4 = new int[10]{1,2,3}; //其余7个int都为0
int* p5 = new int[10]{}; //10个int都为0
delete p1,p3;
delete[] p2;
delete[] p4;
delete[] p5;
// 自定义类型,开空间+调用构造函数初始化
A* p6 = new A;
A* p7 = new A(3);
// 自定义类型,调用析构函数+释放空间
delete p6,p7;
A* p4 = new A[10];
delete[] p4; //开了一个10个A容量的数组
A aa1(1);
A aa2(2);
A* p8 = new A[10]{aa1, aa2};
delete[] p8;
A* p9 = new A[10]{ A(1), A(2)}; //其余8个为0
delete[] p9;
A* p10 = new A[10]{ 1, 2 }; //其余8个为0
delete[] p10;
return 0;
}
2. operator new与operator delete函数
operator new:该函数实际通过malloc来申请空间,当malloc申请空间成功时直接返回;当申请空间失败,尝试执行空 间不足应对措施,如果改应对措施用户设置了,则继续申请,否则抛异常。(相当于malloc + 抛异常)
各函数的原理:
- operator new:malloc + 抛异常
- operator delete :free
- new:operator new +构造函数
- delete:析构函数 + operator delete
- new T[N]:
operator new[]函数(调用operator new函数完成N个对象空间的申请)+
在申请的空间上执行N次构造函数 - delete[]:N次析构函数 + operator delete[](实际上operator delete[]中是调用operator delete来释放空间)
3. 定位new表达式(placement-new)
int main()
{
// 内存池
Stack* pst1 = (Stack*)operator new(sizeof(Stack));
//pst1->Stack(4); // 不支持直接显示调用构造函数
new(pst1)Stack(4); // 支持这样显示调用构造函数
//这3行等价于new
pst1->~Stack(); //析构函数支持直接显示调用
operator delete(pst1);
//这2行等价于delete
return 0;
}
4. malloc/free和new/delete的区别
用法不同:
- 返回值不同,malloc 是 void* ,需要强转,new后跟的是空间的类型
- malloc 手动计算空间大小,new 不用
- 若失败,malloc 返回 NULL,new 捕获异常
- malloc和free是函数,new和delete是操作符
底层原理:
申请自定义类型对象时,malloc/free 只会开辟/释放空间 ,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理。