• <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>

            HUUYUU

            寫(xiě)operator new和operator delete時(shí)要遵循常規(guī)

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

            非類(lèi)成員形式的operator new的偽代碼:

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

              if (size == 0)                      // 處理0字節(jié)請(qǐng)求時(shí),
              {

                    size = 1;                            // 把它當(dāng)作1個(gè)字節(jié)請(qǐng)求來(lái)處理

              }                                    
              while (1)

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

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

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

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

             

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

            會(huì)出錯(cuò),子類(lèi)的size往往大于父類(lèi)的size。最好父類(lèi)的new應(yīng)該這么寫(xiě):

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

              ...                                                    // 否則處理這個(gè)請(qǐng)求
            }

             

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

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

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

              return;
            }

             

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

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

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

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

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

              return;
            }

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

            posted on 2008-01-22 09:42 HUYU 閱讀(414) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            久久综合狠狠综合久久综合88| 精品久久久久久国产| 国产亚洲精品自在久久| 久久精品成人免费网站| 欧美久久一区二区三区| 狠狠色狠狠色综合久久| 曰曰摸天天摸人人看久久久| 中文字幕亚洲综合久久菠萝蜜 | 97久久精品午夜一区二区| 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲 | 国产亚洲美女精品久久久| 久久一区二区三区99| 欧美亚洲色综久久精品国产| 国产精品久久久天天影视香蕉| 人妻久久久一区二区三区| 久久国产香蕉视频| 亚洲国产成人久久精品影视| 99精品国产综合久久久久五月天| 国内精品久久久久久中文字幕| 无码人妻少妇久久中文字幕蜜桃| 久久精品国产WWW456C0M| 国产一久久香蕉国产线看观看| 精品久久久久成人码免费动漫 | 亚洲AV无码一区东京热久久| 久久综合视频网站| 国产 亚洲 欧美 另类 久久| 久久精品人人做人人妻人人玩| 久久这里的只有是精品23| 精品久久久久久无码免费| 国产日产久久高清欧美一区| 久久国产色AV免费观看| 中文字幕乱码人妻无码久久| 精品国产99久久久久久麻豆| 一本久久综合亚洲鲁鲁五月天| 久久高清一级毛片| 久久久精品视频免费观看| 亚洲一本综合久久| 精品久久久久久国产牛牛app| 久久九九青青国产精品| 国产激情久久久久影院小草| 777久久精品一区二区三区无码|