如果函数早期返回或抛出异常,是否会调用对象的析构函数?

mr_*_*r_T 3 c++ destructor

在下面的代码中,我使用包装器对象临时存储内存中db的一些内容.我的问题很简单:

我可以确定析构函数被调用吗?我特别担心a)testCondition为真的情况,并且函数早期从tempObj构造范围的内部范围返回b)在执行此函数期间发生了一些运行时错误(在更高级别捕获)

(作为一个附带问题:这是暂时存储一些数据的好方法吗?在我的应用程序中,someFunc()是当前数据库的保存/导出功能.)

class TempStore
{
public:
    TempStore() {/* delete some stuff from a db and store this in memory*/}
    ~TempStore() {/* write this stuff back into the db*/}
};

void someFunc(bool testCondition)
{
    TempStore tempObj = TempStore();
    // some code
    if (testCondition)
        return; //early return
    // some more code
}
Run Code Online (Sandbox Code Playgroud)

Mik*_*our 6

当程序离开对象的范围时,将调用自动对象的析构函数.这包括从函数返回(早期或其他),并通过异常离开 - 只要处理异常.在异常的情况下,在处理异常之前在堆栈展开期间调用它.

在某些情况下可能不会调用它,包括:

  • 通过电话离开longjmp; 这给出了未定义的行为;
  • 通过未处理的例外离开; 没有说明堆栈是否被解开.
  • 终止程序(例如,调用exit或引发导致终止的信号).