goto 语句可以在不调用析构函数的情况下跨越函数边界吗?
人们普遍认为 goto 跳转绕过了代码的有序执行,包括物体的破坏。然而,这是一种误解,源于对 C 作用域规则的误解。
标签的范围
首先,goto 跳转被限制在它们的范围内。各自的职能。正如您提供的示例所示,跨越函数边界是不可能的。编译器会发出错误,指出跳转起始的函数中未定义标签。
对象初始化和作用域
其次,goto 跳转不能跨越对象的初始化。如果跳转超过对象的声明和初始化点,则进入该对象的作用域,并调用其构造函数。但是,如果跳转回已初始化对象的范围,则在执行跳转之前会调用其析构函数。
保留对象范围
最后,具有自动存储持续时间的对象(即块内声明的变量)不会因 goto 跳转而泄漏。通过 goto 离开对象的作用域会触发其销毁,确保正确处理资源管理。
结论
与普遍看法相反,C 中的 goto 语句不允许用于违反范围规则或导致内存泄漏的不受控制的跳转。虽然由于设计原因,goto 的使用仍然存在争议,但它不会带来通常归因于它的固有风险。
以上是C 中的'goto”语句是否绕过对象析构函数?的详细内容。更多信息请关注PHP中文网其他相关文章!