問題是在它安全到達(dá)目的地之后,函數(shù)不破壞Car對象。它只是簡單地退出,從而使內(nèi)存丟失。
通常,當(dāng)對象pCar出了程序中的作用域時,程序員應(yīng)該依靠析構(gòu)函數(shù)~Car釋放內(nèi)存。但這里辦不到,因?yàn)閜Car的類型不是Car而是Car*,當(dāng)pCar出了作用域時不會調(diào)用析構(gòu)函數(shù)。
修正的函數(shù)如下:
void GoToTheStore(int nOccupants)
{
// get a car。
Car* pCar = GetAnewCar(nOccupants);
// Now drive to the store。
if(pCar)
{
pCar->Drive(Store);
}
// Now delete the object,returning the memory.
delete pCar;
}
使用new操作符構(gòu)造的對象都應(yīng)該用delete運(yùn)算符刪除,這一點(diǎn)必須牢記。
返回對局部內(nèi)存的引用
另一個常見的與內(nèi)存有關(guān)的問題是從函數(shù)返回局部內(nèi)存對象的地址。當(dāng)函數(shù)返回時,對象不再有效。下一次調(diào)用某函數(shù)時,這個內(nèi)存地址可能會被這個新函數(shù)使用。繼續(xù)使用這個內(nèi)存指針就有可能會寫入新函數(shù)的局部內(nèi)存。
這個常見問題以這種方式出現(xiàn):
Car* GetAnewCar(int nOccupants)
{
Car* pCar;
if(nOccupants < 4)
{
pCar = &Car(2); // get a two-door.
}
else
{
pCar = &Car(4); // otherwise, a four-door.
}
return pCar;
}
請注重指針pCar怎樣被賦予由構(gòu)造函數(shù)Car()建立的未命名對象的局部地址的。到目前為止,沒有問題。然而一旦函數(shù)返回這個地址,問題就產(chǎn)生了,因?yàn)樵诜忾]的大括號處臨時對象會被析構(gòu)。
相關(guān)推薦:計(jì)算機(jī)技術(shù)與軟件專業(yè)技術(shù)資格(水平)考試官網(wǎng)匯總
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |