浏览代码

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.
Andreas Kling 5 年之前
父节点
当前提交
9e00651e14
共有 1 个文件被更改,包括 17 次插入1 次删除
  1. 17 1
      Libraries/LibCore/ObjectPtr.h

+ 17 - 1
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<typename U>
@@ -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;