C++中,operator new和operator delete重載舉例

來源:互聯網
上載者:User

根據《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”

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.