我们看如下的代码:
class MyClass {…};
MyClass * p=new MyClass;
这里使用的new是操作符而非函数,实际上,new操作符的执行过程分为三个阶段:
(1). 调用operator new分配内存,operator new(szieof(MyClass));实际上operator new函数会调用malloc函数去分配内存,但这不是本文的重点
(2). 调用构造函数生成类对象
(3). 返回相应的指针
而本文的重点placement new实际上是operator new的重载版本。如果想在已经分配的内存中创建一个对象,我们就需要用到它。大概用法如下:new §A();它会调用合适的构造函数在p指向的内存处创建一个对象,并返回一个指针,也就是说placement new并不会申请空间,只是在原有的空间上新建一个对象,因此,返回的指针和p实际上指向同一块区域
另外要注意的是,对象的空间并不会自动释放,实际上是借助别人的空间来创建对象,因此最后需要显式调用析构函数,p->~A();
实例:
#include <iostream>
using namespace std;
class A
{
public:
A()
{
cout << "A's constructor" << endl;
}
~A()
{
cout << "A's destructor" << endl;
}
void show()
{
cout << "num:" << num << endl;
}
private:
int num;
};
int main()
{
char mem[100];
mem[0] = 'A';
mem[1] = '\0';
mem[2] = '\0';
mem[3] = '\0';
cout << (void*)mem << endl;
A* p = new (mem)A;
cout << p << endl;
p->show();
p->~A();
getchar();
}
new关键字创建对象的时候,对于内置类型,加上()会初始化,不加()不会初始化;对于自定义类型,都会调用默认构造函数,加不加括号没有区别