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