From b695ce7758eee8dd7787c7616f2c3a09fb0978ca Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Fri, 27 Feb 2026 14:50:48 -0500 Subject: [PATCH] Add specialized operator=() to handle nullptr assignment --- include/rcp.h | 11 +++++++++++ tests.cpp | 20 ++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/include/rcp.h b/include/rcp.h index 66b7f48..6ab5fb4 100644 --- a/include/rcp.h +++ b/include/rcp.h @@ -23,6 +23,7 @@ #pragma once #include +#include #include #include @@ -59,6 +60,16 @@ public: } } + rcp & operator=(nullptr_t) noexcept + { + if (ptr) + { + ptr->rcp_dec(); + ptr = nullptr; + } + return *this; + } + rcp & operator=(const rcp & other) { if (ptr != other.ptr) diff --git a/tests.cpp b/tests.cpp index 82159e5..889ab91 100644 --- a/tests.cpp +++ b/tests.cpp @@ -448,6 +448,25 @@ void test_external_class() assert(external_destruct == before + 2); } +void test_assign_nullptr() +{ + int constructed_before = mybase_construct; + int destructed_before = mybase_destruct; + { + rcp base = MyBase::create(6, 6); + assert(mybase_construct == constructed_before + 1); + assert(mybase_destruct == destructed_before); + base = nullptr; + assert(mybase_construct == constructed_before + 1); + assert(mybase_destruct == destructed_before + 1); + base = nullptr; + assert(mybase_construct == constructed_before + 1); + assert(mybase_destruct == destructed_before + 1); + } + assert(mybase_construct == constructed_before + 1); + assert(mybase_destruct == destructed_before + 1); +} + int main(int argc, char * argv[]) { test_class_hierarchy(); @@ -477,5 +496,6 @@ int main(int argc, char * argv[]) test_hash(); test_class_template(); test_external_class(); + test_assign_nullptr(); return 0; }