Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 6529209
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 25, 20262026-05-25T09:36:35+00:00 2026-05-25T09:36:35+00:00

Is it true that goto jumps across bits of code without calling destructors and

  • 0

Is it true that goto jumps across bits of code without calling destructors and things?

e.g.

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

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

Won’t x be leaked?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-25T09:36:35+00:00Added an answer on May 25, 2026 at 9:36 am

    Warning: This answer pertains to C++ only; the rules are quite different in C.


    Won’t x be leaked?

    No, absolutely not.

    It is a myth that goto is some low-level construct that allows you to override C++’s built-in scoping mechanisms. (If anything, it’s longjmp that may be prone to this.)

    Consider the following mechanics that prevent you from doing “bad things” with labels (which includes case labels).


    1. Label scope

    You can’t jump across functions:

    void f() {
       int x = 0;
       goto lol;
    }
    
    int main() {
       f();
    lol:
       return 0;
    }
    
    // error: label 'lol' used but not defined
    

    [n3290: 6.1/1]: [..] The scope of a label is the function in which
    it appears. [..]


    2. Object initialisation

    You can’t jump across object initialisation:

    int main() {
       goto lol;
       int x = 0;
    lol:
       return 0;
    }
    
    // error: jump to label ‘lol’
    // error:   from here
    // error:   crosses initialization of ‘int x’
    

    If you jump back across object initialisation, then the object’s previous “instance” is destroyed:

    struct T {
       T() { cout << "*T"; }
      ~T() { cout << "~T"; }
    };
    
    int main() {
       int x = 0;
    
      lol:
       T t;
       if (x++ < 5)
         goto lol;
    }
    
    // Output: *T~T*T~T*T~T*T~T*T~T*T~T
    

    [n3290: 6.6/2]: [..] 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. [..]

    You can’t jump into the scope of an object, even if it’s not explicitly initialised:

    int main() {
       goto lol;
       {
          std::string x;
    lol:
          x = "";
       }
    }
    
    // error: jump to label ‘lol’
    // error:   from here
    // error:   crosses initialization of ‘std::string x’
    

    … except for certain kinds of object, which the language can handle regardless because they do not require “complex” construction:

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

    [n3290: 6.7/3]: 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. [..]


    3. Jumping abides by scope of other objects

    Likewise, objects with automatic storage duration are not “leaked” when you goto out of their scope:

    struct T {
       T() { cout << "*T"; }
      ~T() { cout << "~T"; }
    };
    
    int main() {
       {
          T t;
          goto lol;
       }
    
    lol:
       return 0;
    }
    
    // *T~T
    

    [n3290: 6.6/2]: 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.
    [..]


    Conclusion

    The above mechanisms ensure that goto doesn’t let you break the language.

    Of course, this doesn’t automatically mean that you “should” use goto for any given problem, but it does mean that it is not nearly as “evil” as the common myth leads people to believe.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

Is it true that the following yields undefined behavior: void * something = NULL;
Is it true that the only way to handle default function arguments is through
Is it true that the smallest amount of memory that I can allocate in
Is it true that you cannot use COM Interop to expose COM properties? Everything
is it true that Rails depend on cookies? It seems that flash is a
Is it true that a service written in C# is unable to give visual
Is it true that any REST based API to upload videos will always require
Is this true that Update SQL Query is slow because of Clustered index??????
Is it true that the syntax for (assign of variable value) is different than
Is it true that the assigned final object field may still be null inside

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.