用法以及编译器解释
placement new 允许我们将object构建于已经分配的内存上。(所以此时必须有个指针指向已经分配好的内存)
没有所谓的placement delete ,因为placement new根本没有分配内存.
也有种说法,是将placement new对应的内存释放掉的操作为placement delete。
char* buf = new char[sizeof(Complex)*3];
Complex* pc = new(buf)Complex(1,2); //将对象分配在已经分配好的内存buf上
...
delete [] buf;
被编译器转为:
Complex *pc;
try{1、void mem = operator new(sizeof(Complex),buf); //在顶点内存2、pc = static_cast<Complex*>(mem); //转型3、pc->Complex::Complex(1,2); //调用构造函数
}
catch(std::bad_alloc){//若allocation失败就不执行构造函数
}
pc、buf指向同一个地方。
关于operator new,此处用的函数与之前提到的函数有点不一样:https://blog.csdn.net/qq_42604176/article/details/111638568
这里的用法为:
你传递分配好的内存给它,它什么都没做,将地址返回。
于是我们可以总结,placement new就是调用了构造函数。
注意,这三种写法是一致的: