寫(xiě)operator new和operator delete時(shí)要遵循常規(guī)
非類(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) 編輯 收藏 引用