From 9e00651e1440263ff78aa29474229e5c18f06053 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 21 Sep 2019 18:07:46 +0200 Subject: [PATCH] LibCore: ObjectPtr should delete the pointee when cleared We were only deleting the pointee when the ObjectPtr was destroyed. If the ObjectPtr is cleared before that, we should also delete the pointee. This is not the most important class to get right, since it will go away as soon as we're able to switch to RefPtr. --- Libraries/LibCore/ObjectPtr.h | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/Libraries/LibCore/ObjectPtr.h b/Libraries/LibCore/ObjectPtr.h index 98a4cd2bf0..ef41e509be 100644 --- a/Libraries/LibCore/ObjectPtr.h +++ b/Libraries/LibCore/ObjectPtr.h @@ -17,9 +17,21 @@ public: { } ~ObjectPtr() + { + clear(); + } + + void clear() { if (m_ptr && !m_ptr->parent()) delete m_ptr; + m_ptr = nullptr; + } + + ObjectPtr& operator=(std::nullptr_t) + { + clear(); + return *this; } template @@ -52,13 +64,17 @@ public: ObjectPtr& operator=(const ObjectPtr& other) { - m_ptr = other.m_ptr; + if (this != &other) { + clear(); + m_ptr = other.m_ptr; + } return *this; } ObjectPtr& operator=(ObjectPtr&& other) { if (this != &other) { + clear(); m_ptr = exchange(other.m_ptr, nullptr); } return *this;