Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p><sub><strong>Warning:</strong> This answer pertains to C++ <em>only</em>; the rules are quite different in C.</sub></p> <hr> <blockquote> <p>Won't <code>x</code> be leaked?</p> </blockquote> <p><strong>No, absolutely not.</strong></p> <p>It is a myth that <code>goto</code> is some low-level construct that allows you to override C++'s built-in scoping mechanisms. (If anything, it's <code>longjmp</code> that may be prone to this.)</p> <p>Consider the following mechanics that prevent you from doing "bad things" with labels (which includes <code>case</code> labels).</p> <hr> <h2>1. Label scope</h2> <p>You can't jump across functions:</p> <pre><code>void f() { int x = 0; goto lol; } int main() { f(); lol: return 0; } // error: label 'lol' used but not defined </code></pre> <blockquote> <p><code>[n3290: 6.1/1]:</code> [..] The scope of a label is the function in which it appears. [..]</p> </blockquote> <hr> <h2>2. Object initialisation</h2> <p>You <a href="http://www.ideone.com/XgGSk">can't jump across object initialisation</a>:</p> <pre><code>int main() { goto lol; int x = 0; lol: return 0; } // error: jump to label ‘lol’ // error: from here // error: crosses initialization of ‘int x’ </code></pre> <p>If you jump <em>back</em> across object initialisation, then <a href="http://codepad.org/iH6V3M03">the object's previous "instance" is destroyed</a>:</p> <pre><code>struct T { T() { cout &lt;&lt; "*T"; } ~T() { cout &lt;&lt; "~T"; } }; int main() { int x = 0; lol: T t; if (x++ &lt; 5) goto lol; } // Output: *T~T*T~T*T~T*T~T*T~T*T~T </code></pre> <blockquote> <p><code>[n3290: 6.6/2]:</code> [..] Transfer out of a loop, out of a block, or back past an initialized variable with automatic storage duration involves the destruction of objects with automatic storage duration that are in scope at the point transferred from but not at the point transferred to. [..]</p> </blockquote> <p>You <a href="http://www.ideone.com/27Qur">can't jump into the scope of an object</a>, even if it's not explicitly initialised: </p> <pre><code>int main() { goto lol; { std::string x; lol: x = ""; } } // error: jump to label ‘lol’ // error: from here // error: crosses initialization of ‘std::string x’ </code></pre> <p>... except for <a href="http://codepad.org/lnrnejbk">certain kinds of object</a>, which the language can handle regardless because they do not require "complex" construction:</p> <pre><code>int main() { goto lol; { int x; lol: x = 0; } } // OK </code></pre> <blockquote> <p><code>[n3290: 6.7/3]:</code> It is possible to transfer into a block, but not in a way that bypasses declarations with initialization. A program that jumps from a point where a variable with automatic storage duration is not in scope to a point where it is in scope is ill-formed unless the variable has scalar type, class type with a trivial default constructor and a trivial destructor, a cv-qualified version of one of these types, or an array of one of the preceding types and is declared without an initializer. [..]</p> </blockquote> <hr> <h2>3. Jumping abides by scope of other objects</h2> <p>Likewise, objects with automatic storage duration <a href="http://codepad.org/HY1JD0Z9">are <em>not</em> "leaked" when you <code>goto</code> out of their scope</a>:</p> <pre><code>struct T { T() { cout &lt;&lt; "*T"; } ~T() { cout &lt;&lt; "~T"; } }; int main() { { T t; goto lol; } lol: return 0; } // *T~T </code></pre> <blockquote> <p><code>[n3290: 6.6/2]:</code> On exit from a scope (however accomplished), objects with automatic storage duration (3.7.3) that have been constructed in that scope are destroyed in the reverse order of their construction. [..]</p> </blockquote> <hr> <h2>Conclusion</h2> <p>The above mechanisms ensure that <code>goto</code> doesn't let you break the language.</p> <p>Of course, this doesn't automatically mean that you "should" use <code>goto</code> for any given problem, but it <em>does</em> mean that it is not nearly as "evil" as the common myth leads people to believe.</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload