如何在ftp给网站做百度自动推送网站收录网
C++中的new与delete
- new 与 delete
- 定位new表达式
new 与 delete
在C++中需要动态申请内存空间时需要使用 new 与 delete 这两个操作符
#include <iostream>
using namespace std;
int main()
{int* p1 = new int;//开辟一块int类型大小的空间给p1int* p2 = new int(1);//开辟一块int类型大小的空间给p2并且初始化为1int* p3 = new int[10];//开辟一块10个int类型大小的空间给p3int* 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;
}