根據《Effective C++ 中文版(第三版)》所講,語句
Widget *pw=new Widget;
“共調用了兩個函數:一個是用以分配記憶體的operator new,一個是Widget的default建構函式。”對於前者,我們可以通過重載operator new符號,進行幹預;對於後者,我們只能編寫建構函式,但是無法阻止或增加執行次數,因為那是編譯器自己增加的代碼,用於在operator new返回的地址處開始,使用Widget的default建構函式初始化記憶體。
遂比著書上的例子,寫了下面的例子:
#include <stdlib.h>#include <iostream.h>#include <memory.h>class C{public:C(){cout<<"Constructing C"<<endl;throw 0;}void* operator new(size_t size)throw(){cout<<"operator new"<<endl;return malloc(size);/*return 0;//將返回結果替換為0以後,整個代碼的輸出僅是operator new*/}void operator delete(void *)throw(){cout<<"operator delete"<<endl;}};int main(){try{/*總是在運算子new返回的[合法]void*指標上 調用class C的建構函式. 如果建構函式拋出異常, 則調用與運算子new對應的運算子delete operator new(size_t size)對應operator delete(void*) operator new(size_t size,void*)對應operator delete(void*,void*) operator new(size_t size,iostream&)對應operator delete(void*,iostream&) 以此類推,能看懂吧?:-)*/C *pc=new C();}catch(int){cout<<"Catch it!"<<endl;}/*//如果是不使用try-catch包圍,//則不會輸出operator delete,//而是程式直接崩潰C *pc=new C();*/return 0;}
輸出結果為:
operator newConstructing Coperator deleteCatch it!
參考資料:
《Effective C++ 中文版,第三版》Scott Meyers著,侯捷譯
之“條款52:寫了placement new也要寫placement delete”