/*
我们一般指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;
}