亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何編寫符合ISO C+標準的自定義新操作符和刪除操作符?

如何編寫符合ISO C+標準的自定義新操作符和刪除操作符?

C++
呼啦一陣風 2019-07-16 16:38:01
如何編寫符合ISO C+標準的自定義新操作符和刪除操作符?如何編寫ISO C+標準一致性自定義new和delete操作員?這是繼續重載新的和刪除的在非常有啟發性的C+FAQ中,操作者超載它的后續行動,為什么要替換默認的新操作符和刪除操作符?第1節:編寫符合標準的new操作者第1部分:理解編寫自定義的要求new操作者第2部分:理解new_handler所需第3部分:理解特定場景需求第2節:編寫符合標準的delete操作者實現自定義刪除操作符(注:這是指堆棧溢出的C+常見問題..如果您想批評以這種形式提供常見問題的想法,那么在元網站上發布的文章引發了這一切就是這樣做的地方。對該問題的回答將在C+聊天室你的答案很可能會被那些想出這個想法的人讀懂。)注意:答案是基于從ScottMeyers的更有效的C+和ISO C+標準中學到的。
查看完整描述

3 回答

?
慕絲7291255

TA貢獻1859條經驗 獲得超6個贊

第二部分

..續

鑒于.的行為operator new從這個例子看,一個精心設計的new_handler 執行下列操作之一:

提供更多內存:這可能允許運算符New‘s循環中的下一次內存分配嘗試成功。實現這一點的一種方法是在程序啟動時分配一個大內存塊,然后在第一次調用新處理程序時釋放它以便在程序中使用。

安裝不同的新處理程序:如果當前的新處理程序無法提供更多可用內存,并且有另一個新處理程序可以使用,則當前的新處理程序可以在其位置安裝另一個新處理程序(通過調用set_new_handler)。下次運算符新調用新處理程序函數時,它將得到最近安裝的函數。

(這個主題的一個變體是由一個新的處理程序來修改它自己的行為,所以下一次調用它時,它會做一些不同的事情。實現這一目標的一種方法是讓新處理程序修改影響新處理程序行為的靜態、命名空間特定的或全局數據。)

卸載新的處理程序:這是通過將空指針傳遞給set_new_handler..沒有安裝新的處理程序,operator new將引發異常(可轉換為)std::bad_alloc當內存分配失敗時。

拋出異常可轉換到std::bad_alloc..這類例外情況是不會被發現的。operator new,但將傳播到發起內存請求的站點。

不返回:打電話abortexit.

實現特定于類的new_handler我們必須提供一個具有它自己的版本的類。set_new_handleroperator new..全班set_new_handler允許客戶端為類指定新的處理程序(與標準完全相同)。set_new_handler允許客戶端指定全局新處理程序)。全班operator new確保在分配類對象的內存時使用類特定的新處理程序代替全局新處理程序。


現在我們明白了new_handler & set_new_handler更好的是,我們能夠修改要求#4適當地作為:

要求4(增強):
我們的operator new應該嘗試分配內存不止一次,每次失敗后調用新的處理函數。這里的假設是,新的處理函數可能能夠做一些事情來釋放一些內存。只有當指向新處理函數的指針是null是嗎?operator new拋出一個異常。

正如承諾的那樣,來自標準的引文:
第3.7.4.1.3節:

未能分配存儲的分配函數可以調用當前安裝的new_handler(18.4.2.2(如有的話)。[注意:程序提供的分配函數可以獲得當前安裝的地址。new_handler使用set_new_handler功能(18.4.2.3)]如果使用空異常聲明的分配函數-規范(15.4), throw()無法分配存儲,它將返回一個空指針。未分配存儲的任何其他分配函數只能通過拋出類的異常來指示失敗。std::bad_alloc(18.4.2.1)或派生自std::bad_alloc.

帶著#4要求,讓我們嘗試為我們的new operator:

void * operator new(std::size_t size) throw(std::bad_alloc){  
   // custom operator new might take additional params(3.7.3.1.1)

    using namespace std;                 
    if (size == 0)                     // handle 0-byte requests
    {                     
        size = 1;                      // by treating them as
    }                                  // 1-byte requests

    while (true) 
    {
        //attempt to allocate size bytes;

        //if (the allocation was successful)

        //return (a pointer to the memory);

        //allocation was unsuccessful; find out what the current new-handling function is (see below)
        new_handler globalHandler = set_new_handler(0);

        set_new_handler(globalHandler);


        if (globalHandler)             //If new_hander is registered call it
             (*globalHandler)();
        else 
             throw std::bad_alloc();   //No handler is registered throw an exception

    }}

延續2


查看完整回答
反對 回復 2019-07-16
  • 3 回答
  • 0 關注
  • 406 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號