C++中的new与delete
new 与 delete
在C++中需要动态申请内存空间时需要使用 new 与 delete 这两个操作符
#include <iostream>
using namespace std;
int main()
{
int* p1 = new int;//开辟一块int类型大小的空间给p1
int* p2 = new int(1);//开辟一块int类型大小的空间给p2并且初始化为1
int* p3 = new int[10];//开辟一块10个int类型大小的空间给p3
int* p4 = new int[10] {1, 2, 3, 4};//开辟一块10个int类型大小的空间给p4并且将前四个初始化
delete p1;
delete p2;
delete[] p3;
delete[] p4;
return 0;
}
这里需要明确,在C++中,new 的最底层实际调用的也是malloc,但除此之外还会调用被new类型的构造函数,delete 的最底层则是free,但除此之外还会调用被delete类型的析构函数
#include <iostream>
using namespace std;
class A
{
public:
A(int x = 0)
{
cout << "调用构造函数A()" << endl;
}
~A()
{
cout << "调用析构函数~A()" << endl;
}
private:
//.......
};
int main()
{
A* p1 = new A;
A* p2 = new A(1);
A* p3 = new A[3];
A* p4 = new A[3]{ 1,2,3 };
delete p1;
delete p2;
delete[] p3;
delete[] p4;
return 0;
}
输出结果如下:
由此可见,new和delete在使用时会调用对应的构造和析构函数
注意 new delete 与 new[] delete[] 不要进行错配使用!否则程序可能崩溃!
定位new表达式
在C++中,new底层其实就是 operator new + 构造函数 ,同理 delete 也是 operator delete + 析构函数 ,所以我们可以将其拆开这样动态申请空间:
#include <iostream>
using namespace std;
class A
{
public:
A(int x = 0)
{
cout << "调用构造函数A()" << endl;
}
~A()
{
cout << "调用析构函数~A()" << endl;
}
private:
//.......
};```
int main()
{
A* p = (A*)operator new(sizeof(A));//声明空间
new(p)A();//调用构造函数进行初始化
p->~A();//调用析构函数释放空间
operator delete(p);//delete释放动态申请的空间
return 0;
}