在下面的代码中,我使用一个包装对象临时存储来自内存中的数据库的一些东西。我的问题很简单:如果函数返回提前或抛出异常,是否会调用对象的析构函数?
我可以确定析构函数被调用吗?我特别担心的是 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
}
您是否尝试添加日志(例如printf或写入文件)并进行调试?在你显示的代码中,析构函数将被调用。 – 2014-09-10 14:55:48
运行时错误是什么意思? C++异常?然后它会工作。如果你的程序真的失败了,seg故障等,那么它将无法工作。 – mkaes 2014-09-10 14:57:12
是的,当'someFunc()'函数返回时,假定“正常”程序执行(*例如*没有崩溃或分段错误),'TempStore'的析构函数将被调用。这被称为[“资源获取初始化”(RAII)习语](https://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization),它是现代C++的基石。 – 2014-09-10 15:02:05