C語(yǔ)言new操作的安全性分析
對(duì)于學(xué)習(xí)過(guò)C語(yǔ)言的朋友應(yīng)該都知道,使用 malloc/calloc 等分配內(nèi)存的函數(shù)時(shí),一定要檢查其返回值是否為“空指針”(亦即檢查分配內(nèi)存的操作是否成功),這是良好的編程習(xí)慣,也是編寫可靠程序所必需的。但是,如果你簡(jiǎn)單地把這一招應(yīng)用到new上,那可就不一定正確了。我經(jīng)常看到類似這樣的代碼:
int * p = new int [MAXSIZE] if (p == 0) // 檢查p指針是否為空 return -1; //other code
其實(shí),這里的 if ( p == 0 ) 完全沒(méi)有意義的。C++ 里,如果 new 分配內(nèi)存失敗,默認(rèn)是拋出異常的。所以,如果分配成功,p == 0 就絕對(duì)不會(huì)成立;而如果分配失敗了,也不會(huì)執(zhí)行 if ( p == 0 ),因?yàn)榉峙涫r(shí),new 就會(huì)拋出異常跳過(guò)后面的代碼。如果你想檢查 new 是否成功,應(yīng)該捕捉異常:
try
{
int * p = new int [MAXSIZE]
}
catch( bad_alloc & exp)
{
cerrr<<exp.what()<<endl;
}
但是 有的程序員并不習(xí)慣捕捉異常,標(biāo)準(zhǔn)C++也提供了一種方法不拋出異常而返回空指針。
int * p = new (std::nothrow)int [MAXSIZE] if (p == 0) // 檢查p指針是否為空 return -1; //other code
相關(guān)文章
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-用棧實(shí)現(xiàn)表達(dá)式求值的方法詳解
本篇文章是對(duì)在c語(yǔ)言中用棧實(shí)現(xiàn)表達(dá)式求值的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C++?棧和隊(duì)列的實(shí)現(xiàn)超詳細(xì)解析
棧和隊(duì)列,嚴(yán)格意義上來(lái)說(shuō),也屬于線性表,因?yàn)樗鼈円捕加糜诖鎯?chǔ)邏輯關(guān)系為?"一對(duì)一"?的數(shù)據(jù),但由于它們比較特殊,因此將其單獨(dú)作為一章,做重點(diǎn)講解2022-03-03
C語(yǔ)言模擬實(shí)現(xiàn)學(xué)生學(xué)籍管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言模擬實(shí)現(xiàn)學(xué)生學(xué)籍管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07
一文帶你深入了解Qt中的順序容器類與關(guān)聯(lián)容器類
Qt中也有很多容器類,他們?cè)诖嫒∷俣取?nèi)存開(kāi)銷等方面進(jìn)行了優(yōu)化,使用起來(lái)更輕量級(jí)、更便捷,下面就跟隨小編一起來(lái)學(xué)習(xí)一下它們的具體使用吧2024-04-04

