【问题标题】:goto and RAII in C++ [duplicate]C++ 中的 goto 和 RAII [重复]
【发布时间】:2014-12-05 23:05:06
【问题描述】:

可能重复:
Goto out of a block: do destructors get called?

我知道 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 的其他 stange 情况呢?

如果您可以在此处发布 C++ 标准的引用,那就太棒了。

【问题讨论】:

  • 顺便说一句,goto 不是运算符。
  • 在 C 中,goto 不是无用的,而是必不可少的。
  • 这是另一个内容丰富的问答:Will using goto leak variables?

标签: c++ goto


【解决方案1】:

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

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

n3376

6.6 跳转语句:[stmt.jump]

第 2 段

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

【讨论】:

  • 有一些方法可以防止自动对象被破坏。例如,setjmp()/longjmp()abort()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-13
  • 2010-09-28
  • 1970-01-01
  • 2011-10-02
  • 2011-07-27
  • 2013-09-22
相关资源
最近更新 更多