goto and RAII in C++
goto and RAII in C++
可能重复:
转到块外:是否调用析构函数?
我知道C和C++中的goto运算符在几乎所有情况下都是无用的,但我只想通过兴趣来知道这个问题的答案,它没有实际意义。
C++标准是否保证在这种情况下必须正确调用对象的析构函数?
#include <iostream>
class Foo
{
public:
Foo() { std::cout << "Foo::Foo() n"; }
~Foo() { std::cout << "Foo::~Foo() n"; }
};
int main()
{
{
std::size_t i = 0;
_1:
Foo instance;
if (!++i)
{
goto _1;
}
}
{
Foo instance;
goto _2;
}
_2:
;
}
http://liveworkspace.org/code/06031e6699c8fddda94b8594ccab1387
关于goto和C++RAII的其他奇怪情况呢?
如果你能在这里发布C++标准的引号,那将是非常酷的。
是。当自动对象超出范围时,保证会对其进行销毁。使用goto
退出作用域的事实对此规则没有影响。
我能想到的唯一不适用的情况是,如果使用std::longjmp退出作用域(在这种情况下,如果有任何带有析构函数的对象,则行为是未定义的)。
n3376
6.6跳转语句:[stmt.Jump]
第2段
在退出一个范围(无论如何完成)时,在该范围内构建的具有自动存储持续时间(3.7.3)的对象将按其构建的相反顺序销毁。[注:临时费用见12.2--end note]转出循环、转出块、或返回经过具有自动存储持续时间的初始化变量涉及销毁具有自动存储时间的对象,这些对象在从传输点到传输点的范围内,但不在传输点到的范围内。(有关块中的传输,请参见6.7)。[注意:但是,程序可以终止(例如通过调用std::exit()或std::abort()(18.5)),而不会破坏具有自动存储持续时间的类对象。--end Note]
相关文章:
- netcat command in c++
- Difference in displaying cv2 Mat
- C++ MFC Libraries in Travis CI
- 如何在OpenSSL中从configuration.h.in获取configuration.h
- 创建具有 new in 函数和"this is nullptr"异常的对象
- IN, OUT, INOUT Parameters
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 有人安装"IITB Simplecpp in mac"吗?
- 从 C 样式字符串中删除子字符串 "in place" 在C++代码中
- 如何修复"error: ‘_1’ was not declared in this scope"?
- Softmax Implementation in C++
- 将 out/in out 参数与 if/switch 的 init 语句一起使用
- IF-nesting in c++
- Gurobi GRBModel and GRBmodel in C++
- Tensorflow Hub in C++
- Centos7 g++ "to_string is not in a member of std"
- InitializeCriticalSectionEx Not Located In KERNEL32.Dll
- 将 lambda 表达式传递给 std::function in C++
- @CPPFLAGS@在 Makefile.in 中意味着什么?
- std::async from std::async in windows xp