问题是在它安全到达目的地之后,函数不破坏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()建立的未命名对象的局部地址的。到目前为止,没有问题。然而一旦函数返回这个地址,问题就产生了,因为在封闭的大括号处临时对象会被析构。
相关推荐:北京 | 天津 | 上海 | 江苏 | 山东 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
广东 | 河北 | 湖南 | 广西 | 河南 |
海南 | 湖北 | 四川 | 重庆 | 云南 |
贵州 | 西藏 | 新疆 | 陕西 | 山西 |
宁夏 | 甘肃 | 青海 | 辽宁 | 吉林 |
黑龙江 | 内蒙古 |