【发布时间】:2011-03-11 22:21:21
【问题描述】:
考虑以下代码:
void foo()
{
{
CSomeClass bar;
// Some code here...
goto label;
// and here...
}
label:
// and here...
}
会调用bar的析构函数吗?
【问题讨论】:
-
为什么你需要知道这个?
goto在生成的代码中是有意义的,但无论如何你可以而且应该避免使用带有析构函数的对象。 -
@MSalters:这根本没有意义,为什么要避免使用带有析构函数的对象?
-
@Viktor:让我扩展句子的第二部分:在生成的代码中,无论如何,你可以而且应该避免使用析构函数的对象。
goto的规范用法是在生成的 FSM 代码中。这里发生了前后跳转,而不考虑恰好位于中间的状态代码状态。 FSM 状态根本不是线性的,但 C++ 代码必须是。 -
需要注意的是
break和continue有一个非常相似的效果,并不是说和goto完全一样,只是标签是由编译器在正确的位置自动生成。然而,for()循环中的break预计会正确,goto也应该如此。
标签: c++ destructor goto