当对象析构函数超出范围时会自动调用它们吗?

时间:2016-05-28 15:27:37

标签: c++ memory-management resource-management

我正在阅读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 ++中的工作方式?

希望我已经很好地解释了我的困惑。提前谢谢!

0 个答案:

没有答案