diff --git a/include/rcp.h b/include/rcp.h index 7657bea..8e8f595 100644 --- a/include/rcp.h +++ b/include/rcp.h @@ -118,6 +118,15 @@ public: other.ptr = nullptr; } + void reset() + { + if (ptr) + { + ptr->rcp_dec(); + ptr = nullptr; + } + } + T * get_raw() const { return ptr; diff --git a/test/tests.cpp b/test/tests.cpp index 08442fc..2e34fde 100644 --- a/test/tests.cpp +++ b/test/tests.cpp @@ -181,6 +181,15 @@ void test_move_assignment_releases_existing() assert(mybase_destruct == destructed_before + 2); } +void test_reset() +{ + int destructed_before = mybase_destruct; + MyB p = MyB::create(1, 2); + p.reset(); + assert(!p); + assert(mybase_destruct == destructed_before + 1); +} + void test_upcast() { rcp derived = MyDerived::create(1.5); @@ -229,6 +238,7 @@ int main(int argc, char * argv[]) test_create(); test_multi_construct_from_raw_pointers(); test_copy_assignment_decrements_previous_reference(); + test_reset(); test_move_constructor(); test_move_assignment(); test_move_assignment_releases_existing();