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