處理內(nèi)存分配異常
正如前面所說,operator new的默認(rèn)行為是請(qǐng)求分配內(nèi)存,如果成功則返回此內(nèi)存地址,如果失敗則調(diào)用一個(gè)new_handler,然后再重復(fù)此過程。于是,想要從operator new的執(zhí)行過程中返回,則必然需要滿足下列條件之一:
* 分配內(nèi)存成功
* new_handler中拋出bad_alloc異常
* new_handler中調(diào)用exit()或類似的函數(shù),使程序結(jié)束
于是,我們可以假設(shè)默認(rèn)情況下operator new的行為是這樣的:
void* operator new(size_t size)
{
void* p = null
while(!(p = malloc(size)))
{
if(null == new_handler)
throw bad_alloc();
try
{
new_handler();
}
catch(bad_alloc e)
{
throw e;
}
catch(…)
{}
}
return p;
}
在默認(rèn)情況下,new_handler的行為是拋出一個(gè)bad_alloc異常,因此 上述循環(huán)只會(huì)執(zhí)行一次。但如果我們不希望使用默認(rèn)行為,可以自定義一個(gè)new_handler,并使用std::set_new_handler函數(shù)使其 生效。在自定義的new_handler中,我們可以拋出異常,可以結(jié)束程序,也可以運(yùn)行一些代碼使得有可能有內(nèi)存被空閑出來,從而下一次分配時(shí)也許會(huì)成 功,也可以通過set_new_handler來安裝另一個(gè)可能更有效的new_handler。例如:
void MyNewHandler()
{
printf(“New handler called!n”);
throw std::bad_alloc();
}
std::set_new_handler(MyNewHandler);
這里new_handler程序在拋出異常之前會(huì)輸出一句話。應(yīng)該注意,在 new_handler的代碼里應(yīng)該注意避免再嵌套有對(duì)new的調(diào)用,因?yàn)槿绻@里調(diào)用new再失敗的話,可能會(huì)再導(dǎo)致對(duì)new_handler的調(diào)用, 從而導(dǎo)致無(wú)限遞歸調(diào)用。--這是我猜的,并沒有嘗試過。
相關(guān)推薦:計(jì)算機(jī)等級(jí)考試二級(jí):C++學(xué)習(xí)重點(diǎn)分析試題北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |