Chinaunix首页 | 论坛 | 博客
  • 博客访问: 840399
  • 博文数量: 190
  • 博客积分: 2991
  • 博客等级: 少校
  • 技术积分: 2400
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-24 18:11
文章分类

全部博文(190)

文章存档

2015年(3)

2014年(1)

2013年(65)

2012年(121)

我的朋友

分类: C/C++

2012-11-11 18:42:33

根据《Effective C++ 中文版(第三版)》所讲,语句

  1. Widget *pw=new Widget;  
“共调用了两个函数:一个是用以分配内存的operator new,一个是Widget的default构造函数。”对于前者,我们可以通过重载operator new符号,进行干预;对于后者,我们只能编写构造函数,但是无法阻止或增加执行次数,因为那是编译器自己增加的代码,用于在operator new返回的地址处开始,使用Widget的default构造函数初始化内存。
遂比着书上的例子,写了下面的例子:
  1. #include   
  2. #include   
  3. #include   
  4. class C{  
  5.     public:  
  6.     C(){  
  7.         cout<<"Constructing C"<
  8.         throw 0;  
  9.     }  
  10.     void* operator new(size_t size)throw(){  
  11.         cout<<"operator new"<
  12.        return malloc(size);  
  13.         /*return 0;//将返回结果替换为0以后, 
  14.                     整个代码的输出仅是operator new*/  
  15.     }  
  16.     void operator delete(void *)throw(){  
  17.         cout<<"operator delete"<
  18.     }  
  19. };  
  20. int main(){  
  21.     try{  
  22.         /*总是在运算符new返回的[合法]void*指针上 
  23.           调用class C的构造函数. 
  24.           如果构造函数抛出异常, 
  25.           则调用与运算符new对应的运算符delete 
  26.           operator new(size_t size)对应operator delete(void*) 
  27.           operator new(size_t size,void*)对应operator delete(void*,void*) 
  28.           operator new(size_t size,iostream&)对应operator delete(void*,iostream&) 
  29.           以此类推,能看懂吧?:-) 
  30.         */  
  31.         C *pc=new C();  
  32.     }catch(int){  
  33.         cout<<"Catch it!"<
  34.     }   
  35.     /* 
  36.     //如果是不使用try-catch包围, 
  37.     //则不会输出operator delete, 
  38.     //而是程序直接崩溃 
  39.     C *pc=new C(); 
  40.     */  
  41.     return 0;  
  42. }  

输出结果为:

  1. operator new  
  2. Constructing C  
  3. operator delete  
  4. Catch it!  
  5. 本文与站长中心同步首发:
阅读(640) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~