C/C++語言中有許多對初學(xué)者(甚至是有經(jīng)驗(yàn)的軟件設(shè)計(jì)師)來說很輕易范的錯(cuò)誤。通曉這樣的錯(cuò)誤可使你免于陷入其中。
忘記初始化指針
這種錯(cuò)誤只是一般“忘記初始化變量”錯(cuò)誤的一個(gè)非凡形式(C/C++中變量不會(huì)自動(dòng)初始化,而Basic可以)。使這種錯(cuò)誤更糟糕的原因是它的后果往往更加糟糕:
void SomeFunction()
{
int *pnVar
int nVal;
nVal = *pnVar; // Bad enough.
*pnVar = nVal; // MUCh worse.
}
在這個(gè)例子中,指針變量pnVar從未被賦值。因此你必須假設(shè)它含有的是雜亂的數(shù)據(jù),從一個(gè)混亂信息指針中讀數(shù)糟糕的很,因?yàn)榻Y(jié)果肯定是雜亂數(shù)據(jù),向一個(gè)混亂信息指針寫數(shù)據(jù)更糟,因?yàn)樗鼘?dǎo)致一些不知道什么地方的數(shù)據(jù)被重寫。
假如被重寫的區(qū)域無用,這到?jīng)]什么危害。假如被重寫的區(qū)域有用,數(shù)據(jù)就會(huì)丟失。這種類型的錯(cuò)誤那么難找,是因?yàn)橹钡匠绦蚱髨D使用已丟失的數(shù)據(jù)時(shí)問題才會(huì)呈現(xiàn)出來。這種問題可能是在數(shù)據(jù)丟失后好久才發(fā)生的。
由于這一問題手工判定很困難,Visual C++編譯器就通過一些努力來避免它的發(fā)生。例如,當(dāng)你編譯上述函數(shù)時(shí)就會(huì)產(chǎn)生一個(gè)警告。在這種情況下,編譯器會(huì)告訴你變量在使用前未被賦值。在很多情況下,它不可能告訴你。
Windows 95操作系統(tǒng)試圖用保護(hù)存儲(chǔ)器在一定程度上幫助解決難題:假如應(yīng)用程序企圖從不屬于它的存儲(chǔ)器讀或?qū)懀琖indows通常能截獲該請求,并立即終止該程序?上В琖indows 95不能截獲對應(yīng)用程序擁有的存儲(chǔ)器的無效訪問,它也不能截獲所有非法訪問,因?yàn)楸仨毐A裟承┤笨,以與Windows 3.1的兼容性名義開放。
忘記釋放堆內(nèi)存
請記住從堆獲得分配的任何內(nèi)存都必須要釋放。假如你用完內(nèi)存以后,忘記釋放它,系統(tǒng)內(nèi)存就會(huì)變得愈來愈小,直到最后你的程序不能運(yùn)行而崩潰。
這個(gè)問題會(huì)出現(xiàn)在諸如下列的一些情況中:
Car* GetAnewCar(int nOccupants)
{
Car* pCar;
if(nOccupants < 4)
{
pCar = new Car(2); // get a two-door.
}
else
{
pCar = new Car(4); // otherwise, a four-door.
}
return pCar;
}
void GoToTheStore(int nOccupants)
{
// get a car。
Car* pCar = GetAnewCar(nOccupants);
// Now drive to the store。
if(pCar)
{
pCar->Drive(Store);
}
}
在此例中,函數(shù)GoToTheStore()首先分配一輛新車來開--這有點(diǎn)浪費(fèi),但你肯定會(huì)同意這種算法可以正常工作。只要分配了新車,它就會(huì)開到有調(diào)用pCar->Drive(Store)所指向的商店。
相關(guān)推薦:計(jì)算機(jī)技術(shù)與軟件專業(yè)技術(shù)資格(水平)考試官網(wǎng)匯總
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |