/* 我们一般指placement new就是指重载new() delete() 我们可以重载class member operatir new(),前提是每一个版本的申明都有独特的参数列, 第一个参数是size_t ,其余参数以new所指定的placement arguments未初值。 foo* p = new(300,'c')foo; */ #include <iostream> #include <cstdlib> using namespace std; class Bad{ public: Bad(){ cout<<"分配内存成功! "<<endl; } } ; class foo{ public: foo(){cout<<"foo::foo()"<<endl; } foo(int ){cout<<"foo::foo(int)"<<endl;throw Bad();//在这里抛出expcetion,测试placement operator delete 如果能够抛出错误就说明内存已经调用起来了。 } //(1)一般的operator new()的重载 void* operator new(size_t size){ return malloc(size); } //(2)这个是标准库已经提供的placement new()的重载形式 void * operator new(size_t size,void*start){ return start; } //(3)这个是新的placement new void * operator new(size_t size,long extra){ return malloc(size+extra); } //(4)这又是一个placement new void * operator new(size_t size,long extra,char init){ return malloc(size+extra); } //(5)这个又是一个placement new但是故意写错第一个参数的type(必须是size_t ,以符合正常的operator new) /* void* operator new(long extra,char init){ return malloc(extra); } */ //我们在上面写了5 个placement new 那么我们就应该写5 个placement delete,但是即使operator delete()不能一一对应于operator new,也不会出现任何报错,意思就是放弃处理ctor发出的任何异常。 }; int main(){ foo str; foo* p1 = new foo; foo* p2 = new(&str)foo; foo* p3 = new(100)foo; foo* p4 = new (100,'a')foo; foo* p5 = new(100)foo(1); return 0; }