首页 >后端开发 >C++ >C 中'goto”是否绕过析构函数执行?

C 中'goto”是否绕过析构函数执行?

Linda Hamilton
Linda Hamilton原创
2024-12-01 04:52:14966浏览

Does `goto` Bypass Destructor Execution in C  ?

Goto 可以在不调用析构函数的情况下遍历函数吗?

一个常见的误解是 goto 会跳过代码段,从而避免执行析构函数和类似函数运营。这种误解在围绕 C 的讨论中尤其明显。

范围限制

与普遍看法相反,goto 无法遍历函数边界。尝试跳转到不同函数中定义的标签会导致编译器错误,如下所示:

void f() {
   int x = 0;
   goto lol;
}

int main() {
   f();
lol:
   return 0;
}

错误:标签“lol”已使用但未定义

对象初始化注意事项

同样不允许跳过对象初始化。如果您尝试跳过对象的初始化,编译器将标记一个错误:

int main() {
   goto lol;
   int x = 0;
lol:
   return 0;
}

错误:跳转到标签'lol'
错误:从这里
错误:交叉初始化'int x'

特定范围的销毁

对象具有自动存储持续时间的文件在退出其范围时都会被销毁,无论退出方式如何。因此,Goto 无法绕过对象销毁:

struct T {
   T() { cout << "*T"; }
  ~T() { cout << "~T"; }
};

int main() {
   {
      T t;
      goto lol;
   }

lol:
   return 0;
}

输出:*T~T

对象类型限制

跳入范围时通常禁止使用非标量对象,但具有简单默认构造函数和析构函数的对象存在例外。没有初始化器的数组声明也可以豁免。

结论

Goto 虽然不是规避 C 作用域机制的漏洞,但如果不小心使用,可能会导致不可预见的行为。尽管如此,上述限制提供了防止无意或有害的 goto 使用的保障措施。因此,它并不像人们普遍认为的那样本质上是邪恶的,但应该谨慎使用。

以上是C 中'goto”是否绕过析构函数执行?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn