需要解释 - 析构函数调用 - c ++ - 构造函数中的异常

时间:2018-03-07 10:12:25

标签: c++ throw

我很抱歉这个问题显然是对文本的理解。 我正在从“The c ++ Programming Language”一书中学习c ++。

在例外部分中,Stroustrup在第357页解释说,只有在构造函数完成时才会调用析构函数(图1)

但是在上一页(356)中,它给出了一个类和一个例子。说即使它被抛出也会被调用析构函数。 (pict2)

我并不是真正理解他想在页面 356 中解释我们的内容,这对我来说肯定是一个糟糕的英语理解。

有人可以帮我解释这个例子的目的吗?

图片1(第357页) enter image description here

图片2(第356页) enter image description here

1 个答案:

答案 0 :(得分:4)

"函数",第356页指的是use_file,而不是构造函数。如果构造函数抛出因为fopen失败并返回null,则析构函数(以及fclose)不会被调用。但是,如果成功构造了对象,然后use_file将引发异常,则将调用f的析构函数并关闭该文件。

本节说明RAII *(资源获取是初始化)。正如它所说,RAII使我们不必在use_file中编写清理代码,如果出现问题;各个物体将通过它们的析构物清理自己。在某些其他语言中,当需要立即清理某些内容时,例如文件句柄,其使用应该包含在try-finally块或using / try / with块中。当对象超出范围时,将调用C ++析构函数,从而无需使用它。

*这也可以称为SBRM(范围限制资源管理)。