一、定位new概念
定位new表达式是在已分配的原始内存空间中调用构造函数初始化一个对象
语法:new(ptr)+构造函数,ptr是一个指针变量
class A {
private:
int _a;
public:
A(int a = 0)//构造函数
:_a(a)
{
cout << _a << ":" << "A(int a = 0)构造函数" << endl;
}
~A()//析构函数
{
cout << _a << ":" << "~A()析构函数" << endl;
}
};
int main()
{
A* ptr1 = (A*)malloc(sizeof(A));
//显示调用构造函数用来初始化一块已经开辟好的空间
new(ptr1)A(10);
//显示调用析构函数
ptr1->~A();
//释放ptr1指向的空间
free(ptr1);
A* ptr2 = (A*)operator new(sizeof(A));
//显示调用构造函数用来初始化一块已经开辟好的空间
new(ptr2)A;
//显示调用析构函数
ptr2->~A();
//释放ptr2指向的空间
operator delete(ptr2);
return 0;
}
二、定位new表达式的使用场景
定位new表达式在实际中一般是配合内存池使用的。因为内存池分配出的内存没有初始化,所以如果是自定义类型的对象,需要使用new定位表达式进行显示调用构造函数对对象进行初始化。