【49】瞭解new_handler的行為

Andy Niu發表於2014-01-24

1、使用operator new無法獲取記憶體時,對於舊式編譯器,會返回一個null指標。對於新式編譯器,會丟擲一個異常。

2、考慮下面的需求,當operator new 無法獲取記憶體時,程式設計師期望獲得通知,並呼叫一個方法。也就是說,向系統傳遞一個回撥方法。這就是new_handler:

  typedef void (* new_handler) (void); new_handler是一個指標方法,形參為空,沒有返回值。

  new_handler set_new_handler(new_handler p) throw ();

  set_new_handler 方法就是傳遞一個回撥方法,返回老的回撥方法。

3、new_handler 的意思就是說,當使用operator new 無法分配記憶體時,轉交給使用者,使用者來做一些事情。new_handler 要做下列事情:

  a、提供更多記憶體可供使用;

  b、安裝另一個new_handler,呼叫另一個方法;

  c、解除安裝new_handler,這時會丟擲異常;

  d、丟擲bad_alloc異常;

  e、不返回,呼叫abort或者exit。

4、C++並不支援class專屬的new_handler。也就是說,程式設計師期望,對於不同的class,在堆上分配物件無法獲取記憶體時,可以做不同的事情,但是C++不支援class專屬的new_hanlder,也就是說,所有的operator new 共享new_handler,那該怎麼辦?

  想法是:分配Widget物件之前,安裝Widget的new_handler,分配成功後,解除安裝Widget的new_handler。

5、為了保證能夠解除安裝成功,需要使用資源管理類,對老的new_handler管理,析構的時候,重新指向老的new_handler。

6、為了可以支援不同class,建立一個模板類,並且把set_new_handler有關的程式碼上移到父類,具體的類繼承類模版。 

相關文章