问题
I have such code as follows
try {
doSomething();
} catch(InterruptException) {
goto rewind_code;
}
if(0) {
rewind_code:
longjmp(savepoint, 1);
}
My question is, is the exception object that is stored by the C++ runtime free'ed when I goto
out of the catch block? Or is the runtime allowed to cache it until the surrounding function exists or something like that? I simply want to ensure that if I execute above code multiple times, each time taking the rewind code, I won't leak memory (because the longjmp
won't execute cleanup code emitted by the compiler into or before function prologues).
回答1:
§6.6/2:
On exit from a scope (however accomplished), destructors (12.4) are called for all constructed objects with automatic storage duration...
At least as I'd read it, "however accomplished" should/does include a goto
.
Edit: Okay, based on Johannes's comment, what we care about is §15.1/4:
When the last handler being executed for the exception exits by any means other than throw; the temporary object is destroyed and the implementation may deallocate the memory for the temporary object;
[ ... ]
The destruction occurs immediately after the destruction of the object declared in the exception-declaration in the handler.
回答2:
§ 15.1.4
The memory for the exception object is allocated in an unspecified way, except as noted in 3.7.4.1. If a handler exits by rethrowing, control is passed to another handler for the same exception. The exception object is destroyed after either the last remaining active handler for the exception exits by any means other than rethrowing, or the last object of type std::exception_ptr (18.8.5) that refers to the exception object is destroyed, whichever is later. In the former case, the destruction occurs when the handler exits, immediately after the destruction of the object declared in the exception-declaration in the handler, if any. In the latter case, the destruction occurs before the destructor of std::exception_ptr returns. The implementation may then deallocate the memory for the exception object; any such deallocation is done in an unspecified way.
来源:https://stackoverflow.com/questions/7262818/if-i-jump-out-of-a-catch-block-with-goto-am-i-guaranteed-that-the-exception-o