Browse Source

Exceptionpropagation from the deleter prevented. As the deleter is

called from within the dtor, this may otherwise cause UB (fixes #7).
main
offa 7 years ago
parent
commit
a8cd4a3852
2 changed files with 18 additions and 1 deletions
  1. +11
    -1
      include/scope_guard.h
  2. +7
    -0
      test/ScopeGuardTest.cpp

+ 11
- 1
include/scope_guard.h View File

{ {
if( m_execute_on_destruction == true ) if( m_execute_on_destruction == true )
{ {
m_deleter();
callDeleterSafe();
} }
} }




private: private:


void callDeleterSafe() noexcept
{
try
{
m_deleter();
}
catch( ... ) { /* Empty */ }
}


Deleter m_deleter; Deleter m_deleter;
bool m_execute_on_destruction; bool m_execute_on_destruction;
}; };

+ 7
- 0
test/ScopeGuardTest.cpp View File

REQUIRE(executed == false); REQUIRE(executed == false);
} }


TEST_CASE("no exception propagation from deleter", "[ScopeGuard]")
{
REQUIRE_NOTHROW([] {
auto guard = sr::scope_guard([] { throw "Don't propagate this!"; });
static_cast<void>(guard);
}());
}

Loading…
Cancel
Save