//Complex类
class Complex{
public:
int i;
int j;
Complex(){}
Complex(int i,int j):i(i),j(j){cout<<"i:"<<i<<" "<<"j:"<<j<<endl;}
~Complex(){cout<<"free"<<endl;}
};
placement new 允许我们将对象建构在一个已经分配的内存中。是一种定点(即提前分配好空间的)new
#include <iostream>
#include <new>//引入new头文件
using namespace std;
int main(){
char* buf=new char[sizeof(Complex)*3];
Complex* pc=new(buf)Complex(1,2);//结果is i:1 j:2
delete [] buf;
return 0;
}
这个buf是已经分配好的空间,这个Complex对象是建在buf上面。
这个buf已经分配好所以不会再分配内存。
Complex* pc=new(buf)Complex(1,2);
//这一行被编译器转为下面的形式
try
{
void* mem = operator new(sizeof(Complex),buf);//allocate
pc=static_cast<Complex*>(mem);//cast转换类型
pc->Complex::Complex(1,2);//construct调用构造函数
}
catch(std::bad_alloc){
//若allocation失败则不执行构造函数
}
operator new的源码:不做事。因为已经分配好了空间。
void* operator new(size_t,void* loc)
{return loc;}
因为placement new没有分配内存所以就没有placement delete
而buf分配了内存所以buf要delete
placement new具体指的是
new§或者
::operator new(size,void*)
以上来自侯捷老师视频仅用于学习。