C++ 如果函数提前返回或抛出异常,是否会调用对象的析构函数?

C++ 如果函数提前返回或抛出异常,是否会调用对象的析构函数?,c++,destructor,C++,Destructor,在下面的代码中,我使用包装器对象在内存中临时存储数据库中的一些内容。我的问题很简单: 我能确定调用了析构函数吗?我特别担心的是 a) testCondition为true,函数从构建tempObj的作用域的内部作用域中提前返回 b) 在执行此函数期间发生一些运行时错误(在更高级别捕获) (附带问题:这是临时存储某些数据的好方法吗?在我的应用程序中,someFunc()是当前数据库的保存/导出功能。) 是的,将调用析构函数。若您提前返回,在堆栈上创建的每个对象都将正确销毁。如果抛出异常,将在程序执

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

我能确定调用了析构函数吗?我特别担心的是 a)
testCondition
为true,函数从构建
tempObj
的作用域的内部作用域中提前返回 b) 在执行此函数期间发生一些运行时错误(在更高级别捕获)

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


是的,将调用析构函数。若您提前返回,在堆栈上创建的每个对象都将正确销毁。如果抛出异常,将在程序执行到达catch块后调用析构函数。

除非程序由于seg故障或断电或其他原因而崩溃,否则将调用析构函数。仅仅从函数中提前返回或引发异常不足以停止析构函数的运行


但这种设计有点缺陷,因为写入数据库是一种可能失败的操作,从析构函数引发异常是一个非常糟糕的主意。

当程序离开对象的作用域时,将调用自动对象的析构函数。这包括从函数返回(提前或以其他方式),以及通过异常离开-只要异常得到处理。对于异常,在处理异常之前,在堆栈展开期间调用它

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

  • 通过调用
    longjmp
    离开;这给出了未定义的行为
  • 通过未处理的异常离开;未指明堆栈是否已展开
  • 终止程序(例如,调用
    退出
    ,或发出导致终止的信号)

您是否尝试过添加日志(例如printf或写入文件)并进行调试?在您显示的代码中,将调用析构函数。运行时错误是什么意思?C++异常?那就行了。如果您的程序真的失败,seg fault等,那么它将无法工作。是的,
someFunc()
函数返回时,将调用
TempStore
的析构函数,假设程序执行“正常”(例如,没有崩溃或分段错误)。这就是所谓的,它是现代C++的基石。是的,我已经做过了,而且看起来很好。但由于我刚刚开始在一个大型项目上进行合作,我还不知道该项目的所有依赖性以及可能的运行时错误和怪癖,所以我希望获得某种“语法保证”,即我的对象在任何情况下都会被破坏。这个答案是不完整的,因此是错误的。从标题:“如果函数…崩溃,会调用对象的析构函数吗?”我想他说的是异常而不是崩溃。即使对于异常,如果代码没有在try块中运行,也不会发生这种情况。对不起,代码是在更高级别的try块中运行的。我会修改标题你能建议我如何处理这样的案件吗?如果从析构函数抛出异常,会发生什么?
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
}