6

可能重复:
转到块外:是否调用析构函数?

我知道 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/06031e6​​699c8fddda94b8594ccab1387

goto 和 C++ RAII 的其他 stange 情况呢?

如果您可以在此处发布 C++ 标准的引用,那将是非常酷的。

4

1 回答 1

11

是的。自动对象保证在超出范围时被破坏。使用退出范围这一事实goto对此规则没有影响。

我能想到的唯一不成立的情况是,如果使用std::longjmp退出范围(在这种情况下,如果有任何带有析构函数的对象,行为是未定义的)。

n3376

6.6 跳转语句:[stmt.jump]

第 2 段

从范围退出时(无论如何完成),已在该范围内构建的具有自动存储持续时间 (3.7.3) 的对象将按其构建的相反顺序销毁。[注:对于临时性,见 12.2。—end note] 转移出循环,转移出块,或返回具有自动存储持续时间的初始化变量涉及销毁具有自动存储持续时间的对象,这些对象在转移点范围内但不在转移点范围内. (参见 6.7 中的转移到块)。[注意:但是,可以终止程序(例如,通过调用 std::exit() 或 std::abort() (18.5))而不会破坏具有自动存储持续时间的类对象。——尾注]

于 2012-08-27T20:19:53.350 回答