我正在阅读Scott Meyers Effective C ++,我对资源管理有疑问。在书中,他建议应该使用auto_ptr对象来管理内存,因为它会在超出范围时自动调用它指向的对象的析构函数。以下是提供的示例:
void f() {
Investment *pInv = createInvestment(); // Call factory function
... // use pInv
delete pInv; // release object
}
他声称这可能存在问题,因为...
中可能会发生许多事情,导致该方法无法到达delete pInv
(过早返回语句,抛出异常,... )。这是他在其位置上建议的代码
void f() {
std::auto_ptr<Investment> pInv(createInvestment()); // call factory function
... // use pInv as before
} // automatically delete pInv
这是有效的,因为无论发生什么,pInv
在超出范围时都会被删除。
我的问题是:当pInv
的析构函数超出第一个代码块的范围时,为什么不会调用它。不会过早的返回语句将对象推出范围,或者不是垃圾收集在C ++中的工作方式?
希望我已经很好地解释了我的困惑。提前谢谢!