定位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定位表达式进行显示调用构造函数对对象进行初始化。