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

@@ -28,7 +28,7 @@ namespace sr
{
if( m_execute_on_destruction == true )
{
m_deleter();
callDeleterSafe();
}
}

@@ -45,6 +45,16 @@ namespace sr

private:

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


Deleter m_deleter;
bool m_execute_on_destruction;
};

+ 7
- 0
test/ScopeGuardTest.cpp View File

@@ -64,3 +64,10 @@ TEST_CASE("move transfers state if released", "[ScopeGuard]")
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