在編程時我們應(yīng)該注意到對new的調(diào)用是有可能有異常被拋出的,因此在new的代碼周圍應(yīng)該注意保持其事務(wù)性,即不能因為調(diào)用new失敗拋出異常來導(dǎo)致不正確的程序邏輯或數(shù)據(jù)結(jié)構(gòu)的出現(xiàn)。例如:
class SomeClass
{
static int count;
SomeClass() {}
public:
static SomeClass* GetNewInstance()
{
count++;
return new SomeClass();
}
};
靜態(tài)變量count用于記錄此類型生成的實例的個數(shù),在上述代碼中,如果因new分配內(nèi)存失敗而拋出異常,那么其實例個數(shù)并沒有增加,但count變量的值卻已經(jīng)多了一個,從而數(shù)據(jù)結(jié)構(gòu)被破壞。正確的寫法是:
static SomeClass* GetNewInstance()
{
SomeClass* p = new SomeClass();
count++;
return p;
}
這樣一來,如果new失敗則直接拋出異常,count的值不會增加。類似的,在處理線程同步時,也要注意類似的問題:
void SomeFunc()
{
lock(someMutex); //加一個鎖
delete p;
p = new SomeClass();
unlock(someMutex);
}
此時,如果new失敗,unlock將不會被執(zhí)行,于是不僅造成了一個指向不正確地址的指針p的存在,還將導(dǎo)致someMutex永遠不會被解鎖。這種情況是要注意避免的。(參考:C++箴言:爭取異常安全的代碼)
相關(guān)推薦:計算機等級考試二級:C++學(xué)習(xí)重點分析試題北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |