zoukankan      html  css  js  c++  java
  • 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;
    }
    

      

  • 相关阅读:
    On the fly test
    Spec Explorer 工具学习
    C# Static修饰符的作用
    [转]C#静态方法与非静态方法的比较
    如何获取网站服务器运行状态
    C#快速整理代码格式
    UI auto程序结构组织方式
    TestClass必须是public的
    VS2012如何显示行号
    Error: member names cannot be the same as their enclosing type
  • 原文地址:https://www.cnblogs.com/yjds/p/8953070.html
Copyright © 2011-2022 走看看