問題是在它安全到達目的地之后,函數不破壞Car對象。它只是簡單地退出,從而使內存丟失。
通常,當對象pCar出了程序中的作用域時,程序員應該依靠析構函數~Car釋放內存。但這里辦不到,因為pCar的類型不是Car而是Car*,當pCar出了作用域時不會調用析構函數。
修正的函數如下:
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操作符構造的對象都應該用delete運算符刪除,這一點必須牢記。
返回對局部內存的引用
另一個常見的與內存有關的問題是從函數返回局部內存對象的地址。當函數返回時,對象不再有效。下一次調用某函數時,這個內存地址可能會被這個新函數使用。繼續使用這個內存指針就有可能會寫入新函數的局部內存。
這個常見問題以這種方式出現:
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怎樣被賦予由構造函數Car()建立的未命名對象的局部地址的。到目前為止,沒有問題。然而一旦函數返回這個地址,問題就產生了,因為在封閉的大括號處臨時對象會被析構。
相關推薦:北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內蒙古 |