Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 需要解释-析构函数调用-c++;-构造函数中的异常_C++_Throw - Fatal编程技术网

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

C++ 需要解释-析构函数调用-c++;-构造函数中的异常,c++,throw,C++,Throw,很抱歉,这个问题显然是对文本的理解。 我从《C++编程语言》一书中学习C++。 在异常部分,Stroustrup在第357页解释说,只有在构造函数完成时才会调用析构函数(PICT1) 但在前一页(356)中,它给出了一个类的示例&表示即使抛出析构函数,也会调用它(图2) 我真的不明白他想在356页给我们解释什么,我的英语理解肯定不好 有人能帮我解释一下这个例子的目的吗 图1(第357页) 图2(第356页) 第356页的“函数”指的是使用文件,而不是构造函数。如果构造函数因为fopen失败而抛

很抱歉,这个问题显然是对文本的理解。 我从《C++编程语言》一书中学习C++。 在异常部分,Stroustrup在第357页解释说,只有在构造函数完成时才会调用析构函数(PICT1)

但在前一页(356)中,它给出了一个类的示例&表示即使抛出析构函数,也会调用它(图2)

我真的不明白他想在356页给我们解释什么,我的英语理解肯定不好

有人能帮我解释一下这个例子的目的吗

图1(第357页)

图2(第356页) 第356页的“函数”指的是
使用文件
,而不是构造函数。如果构造函数因为
fopen
失败而抛出并返回null,则不会调用析构函数(因此
fclose
)。但是,如果对象成功构造,然后
use\u file
稍后抛出异常,则将调用
f
的析构函数并关闭该文件

本节说明RAII*(资源获取是初始化)。正如它所说的,RAII使我们不必在出现问题时在
use\u file
中编写清理代码;单个对象将通过其析构函数进行自我清理。在其他一些语言中,当需要立即清理某些内容(如文件句柄)时,应将其使用包装在try finally块或using/try/with块中。当对象超出范围时,调用C++析构函数,消除此需求。


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

第356页的“功能”指的是
使用文件,而不是构造函数。如果构造函数因为
fopen
失败而抛出并返回null,则不会调用析构函数(因此
fclose
)。但是,如果对象成功构造,然后
use\u file
稍后抛出异常,则将调用
f
的析构函数并关闭该文件

本节说明RAII*(资源获取是初始化)。正如它所说的,RAII使我们不必在出现问题时在
use\u file
中编写清理代码;单个对象将通过其析构函数进行自我清理。在其他一些语言中,当需要立即清理某些内容(如文件句柄)时,应将其使用包装在try finally块或using/try/with块中。当对象超出范围时,调用C++析构函数,消除此需求。



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

这不是本文所说的。这篇文章说:“析构函数将被独立调用,不管函数是正常退出还是因为抛出异常而退出。”这与只为完全构造的子对象调用析构函数的说法并不矛盾,以防c'tor抛出。我想知道这本书的复制距离侵犯版权有多远。@Oliv鉴于它至少有357页,为了教育目的复制其中两页几乎肯定属于“合理使用”(虽然我不是一个层;这不是法律建议;这条信息可能在10秒内自毁).向下滚动图像中的文字,我以为我喝醉了一段时间second@StoryTeller当前位置我惊讶地发现,当我到达底部时,我不知道这不是课文所说的。这篇文章说:“析构函数将被独立调用,不管函数是正常退出还是因为抛出异常而退出。”这与只为完全构造的子对象调用析构函数的说法并不矛盾,以防c'tor抛出。我想知道这本书的复制距离侵犯版权有多远。@Oliv鉴于它至少有357页,为了教育目的复制其中两页几乎肯定属于“合理使用”(虽然我不是一个层;这不是法律建议;这条信息可能在10秒内自毁).向下滚动图像中的文字,我以为我喝醉了一段时间second@StoryTeller当前位置我惊讶地发现,在到达底部时,我并不感谢你指出,事实上,他的意思是,如果在“f”的创建之后出现了问题,f的析构函数仍将被调用感谢你指出,事实上,他的意思是,如果在“f”的创建之后出现了问题,f的析构函数仍将被调用