• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

              C++博客 :: 首頁 :: 聯(lián)系 ::  :: 管理
              163 Posts :: 4 Stories :: 350 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(48)

            我參與的團隊

            搜索

            •  

            積分與排名

            • 積分 - 401320
            • 排名 - 59

            最新評論

            閱讀排行榜

            評論排行榜

            自己重寫operator new時,很重要的一點是函數(shù)提供的行為要和系統(tǒng)缺省的operator new一致。實際做起來也就是:要有正確的返回值;可用內(nèi)存不夠時要調(diào)用出錯處理函數(shù);處理好0字節(jié)內(nèi)存請求的情況。此外,還要避免不小心隱藏了標(biāo)準(zhǔn)形式的new。

            非類成員形式的operator new的偽代碼:

            void * operator new(size_t size)        // operator new還可能有其它參數(shù)
            {                                      

              if (size == 0)                      // 處理0字節(jié)請求時,
              {

                    size = 1;                            // 把它當(dāng)作1個字節(jié)請求來處理

              }                                    
              while (1)

            {
                分配size字節(jié)內(nèi)存;

                  if (分配成功)
                       return (指向內(nèi)存的指針);

                // 分配不成功,找出當(dāng)前出錯處理函數(shù)
                  new_handler globalhandler = set_new_handler(0);
                 set_new_handler(globalhandler);

                  if (globalhandler) (*globalhandler)();
                  else throw std::bad_alloc();
              }
            }

             

            為特定類寫的new往往沒有考慮該類被繼承的情況,使用sizeof(父類)獲得大小,但是如果發(fā)生子類調(diào)用父類的new時,往往

            會出錯,子類的size往往大于父類的size。最好父類的new應(yīng)該這么寫:

            void * base::operator new(size_t size)
            {
              if (size != sizeof(base))                  // 如果數(shù)量“錯誤”,讓標(biāo)準(zhǔn)operator new,精華部分。
                return ::operator new(size);        // 去處理這個請求
                                                                     //

              ...                                                    // 否則處理這個請求
            }

             

            對于operator delete(以及它的伙伴operator delete[]),情況更簡單。所要記住的只是,c++保證刪除空指針永遠是安全的,所以你要充分地應(yīng)用這一保證。

            下面是非類成員形式的operator delete的偽代碼:
            void operator delete(void *rawmemory)
            {
              if (rawmemory == 0) return;   //如果指針為空,返回
                                             //

              釋放rawmemory指向的內(nèi)存;

              return;
            }

             

            這個函數(shù)的類成員版本也簡單,只是還必須檢查被刪除的對象的大小。假設(shè)類的operator new將“錯誤”大小的分配請求轉(zhuǎn)給::operator new,那么也必須將“錯誤”大小的刪除請求轉(zhuǎn)給::operator delete:

            void base::operator delete(void *rawmemory, size_t size)
            {
              if (rawmemory == 0) return;          // 檢查空指針

              if (size != sizeof(base))                 // 如果size"錯誤",

            {    
                ::operator delete(rawmemory);  // 讓標(biāo)準(zhǔn)operator來處理請求
                return;                       
              }

              釋放指向rawmemory的內(nèi)存;

              return;
            }

            有關(guān)operator new和operator delete(以及他們的數(shù)組形式)的規(guī)定不是那么麻煩,重要的是必須遵守它。只要內(nèi)存分配程序支持new-handler函數(shù)并正確地處理了零內(nèi)存請求,就差不多了;如果內(nèi)存釋放程序又處理了空指針,那就沒其他什么要做的了。至于在類成員版本的函數(shù)里增加繼承支持,那將很快就可以完成。

            posted on 2008-01-18 21:24 sdfasdf 閱讀(3650) 評論(0)  編輯 收藏 引用 所屬分類: C++
            久久精品国产WWW456C0M| 久久精品无码午夜福利理论片| 色偷偷久久一区二区三区| 欧美噜噜久久久XXX| 久久久久久一区国产精品| 无码久久精品国产亚洲Av影片| 青青草原综合久久| 久久人人添人人爽添人人片牛牛| 久久精品人人做人人爽电影蜜月 | 欧美va久久久噜噜噜久久| 欧美大战日韩91综合一区婷婷久久青草| 97精品国产91久久久久久| 俺来也俺去啦久久综合网| 亚洲va久久久噜噜噜久久狠狠| 久久福利片| 久久国产免费直播| 麻豆成人久久精品二区三区免费| 久久无码人妻一区二区三区午夜| 思思久久99热只有频精品66| 久久九九久精品国产免费直播| 狠狠色婷婷久久一区二区| 久久成人国产精品| 久久久久久综合一区中文字幕| 丁香五月综合久久激情| 国产亚洲精久久久久久无码77777 国产亚洲精品久久久久秋霞 | 久久综合色老色| 亚洲国产成人久久综合碰碰动漫3d| 久久国产精品久久| 国产A级毛片久久久精品毛片| 亚洲国产精品无码成人片久久| 久久天堂AV综合合色蜜桃网| 久久久久国产一区二区三区| 久久强奷乱码老熟女网站| 99久久无码一区人妻| 亚洲中文字幕无码久久2020| 精品久久久久国产免费| 国产一区二区三区久久| 久久精品这里热有精品| 国产精品久久久久久影院 | 久久综合九色综合网站| 久久伊人五月丁香狠狠色|