使用goto会导致内存泄漏吗?

Fak*_*ken 11 c++ memory-leaks goto

我有一个程序,我需要打破一大堆嵌套for循环.到目前为止,大多数人告诉我这样做的方式是在我的代码中使用一个丑陋的goto.

现在,如果我创建一堆本地堆栈(我认为这就是它们被称为,如果不是,我的意思是只使用常规变量而不使用新命令)我的循环中的变量和我的程序命中一个if语句触发goto,我会遇到内存泄漏,因为我的程序不正确地退出许多循环并且没有清理局部变量?

Rob*_*ino 20

不,你不会导致内存泄漏.使用a goto不是"不正确地退出循环".这只是一般不建议从代码结构点的视图.

除此之外,当您离开循环时,局部变量将超出范围并在过程中从堆栈弹出(即清理).


NoM*_*ots 5

堆栈变量(autos,而不是autobots)不像通过new()或malloc()分配的变量那样"泄漏".

至于那些只是教条的"丑陋".阅读Knuth,他和Dijkstra一样出色.http://pplab.snu.ac.kr/courses/adv_pl05/papers/p261-knuth.pdf避免面食编程,但小心使用不会降低意大利面.

Dijkstra不喜欢它们,因为你可以用其他结构化编程技术完成你可以用gotos做的大部分工作,并且使用更少的代码,因此使得其他结构更不容易出错.

明白不应该是你的第一个解决方案,并且不要忘记使用它们,但如果它有意义,不要服从教条式的怪物小怪.破坏声明只是伪装的一种转向,专为严格遵守"你不应该使用"的诫命没有意义的情况而设计.

  • Break打破了Dijkstra非常喜欢的"单一退出"标准.它会让你从一个结构良好的构造中间退出,例如一个循环,它有一个入口和一个单独的出口.休息时必须结合使用条件评估才能切实可行.如果<condition> goto是dijstra想要用结构化编程替换的语句类型.如果<condition> break是相同的构造,其中唯一的区别是goto被break替换.对于这些情况,休息只考虑比goto稍微好一点,因为你在休息可以转到的地方受到限制. (4认同)