Is it safe to use longjmp and setjmp in C++ on linux/gcc with regards to the following?
- Exception handling (I'm not implementing exception handling using longjmp/setjmp. I want to know what side effects longjmp/setjmp will have on standard exception handling)
*this
pointer- Signals
- Smart pointers (boost's shared and intrusive pointers)
- Anything else you can think of.
setjmp()
/longjmp()
completely subvert stack unwinding and therefore exception handling as well as RAII (destructors in general).
From 18.7/4 "Other runtime support" in the standard:
If any automatic objects would be destroyed by a thrown exception transferring control to another (destination) point in the program, then a call to
longjmp(jbuf, val)
at the throw point that transfers control to the same (destination) point has undefined behavior.
So the bottom line is that setjmp()
/longjmp()
do not play well in C++.
It's not specific to Linux or gcc; setjmp / longjmp and C++ don't work too well together if you're using longjmp to leave a context where there are automatic variables with destructors.
The destructors won't run which may result in a memory leak or other bad behaviour.
来源:https://stackoverflow.com/questions/1376085/c-safe-to-use-longjmp-and-setjmp