http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59656
Bug ID: 59656 Summary: weak_ptr::lock function crashes when compiling with -fno-exceptions flag Product: gcc Version: 4.8.1 Status: UNCONFIRMED Severity: major Priority: P3 Component: libstdc++ Assignee: unassigned at gcc dot gnu.org Reporter: chus_flores at hotmail dot com weak_ptr::lock crashes when the code is compiled with the -fno-exceptions flag and the data pointed by the weak_ptr expires during the execution of the lock function itself: (from http://gcc.gnu.org/onlinedocs/gcc-4.8.2/libstdc++/api/a01518_source.html) shared_ptr<_Tp> 494 lock() const noexcept 495 { 496 #ifdef __GTHREADS 497 if (this->expired()) 498 return shared_ptr<_Tp>(); 499 500 __try 501 { 502 return shared_ptr<_Tp>(*this); 503 } 504 __catch(const bad_weak_ptr&) 505 { 506 return shared_ptr<_Tp>(); 507 } 508 #else 509 return this->expired() ? shared_ptr<_Tp>() : shared_ptr<_Tp>(*this); 510 #endif 511 } If the data is valid when line 497 is executed and the data is released in a different thread just before executing line 502, the program will crash because it will try to throw an exception (exceptions are disabled because of the flag -fno-exceptions). This code only works when exceptions are enabled because the try/catch will resolve the problem, but not otherwise. The standard definition says that this function must return safely and it doesn't throw any exception. I presume this must apply even if the exceptions are not enabled.