goto 跳转可以跨代码而不调用析构函数吗?
问题: goto 跳转真的可以绕过代码吗不执行的部分析构函数?
示例:考虑以下代码:
void f() { int x = 0; goto lol; } int main() { f(); lol: return 0; }
goto 跳转后对象 x 会被删除吗?
答案:
不,物体x 不会被泄露。
这种信念是一种常见的误解。 goto 跳转不会规避 C 的作用域机制,并且析构函数会按预期调用。
1.标签范围:
Goto 语句不能跨越函数边界。标签的范围仅限于定义它的函数。
2.对象初始化:
Goto 跳转无法绕过对象初始化。尝试跳过未初始化的对象将导致编译器错误。同样,跳回已初始化的对象将导致其先前的实例被销毁。
3.对象的范围:
当 goto 跳转退出其范围时,具有自动存储持续时间的对象不会泄漏。 C 确保对象在退出作用域时按照其构造的相反顺序被销毁。
结论:
Goto 跳转完全尊重 C 的作用域和销毁规则。不可能使用 goto 来规避这些机制并导致内存泄漏。不过,仍然不建议过度使用 goto,因为它会导致代码难以理解和维护。
以上是在 C 中 `goto` 是否跳过析构函数调用?的详细内容。更多信息请关注PHP中文网其他相关文章!