placement new

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

  

猜你喜欢

转载自www.cnblogs.com/yjds/p/8953070.html