[Bf-blender-cvs] [c14b1137464] master: Fix: Geometry Nodes: Memory leak when deleting instances

Hans Goudey noreply at git.blender.org
Wed Oct 19 20:12:43 CEST 2022


Commit: c14b1137464708cccc9034e8abfd509f55c8ca85
Author: Hans Goudey
Date:   Wed Oct 19 13:12:20 2022 -0500
Branches: master
https://developer.blender.org/rBc14b1137464708cccc9034e8abfd509f55c8ca85

Fix: Geometry Nodes: Memory leak when deleting instances

The instance attributes assignment operators were broken in multiple
ways: there wasn't a move constructor (probably causing performance
issues), and the destination attributes weren't freed before they
were replaced.

===================================================================

M	source/blender/blenkernel/BKE_attribute.hh
M	source/blender/blenkernel/intern/attribute_access.cc

===================================================================

diff --git a/source/blender/blenkernel/BKE_attribute.hh b/source/blender/blenkernel/BKE_attribute.hh
index 7b13b8a2b09..a4f9d73c31e 100644
--- a/source/blender/blenkernel/BKE_attribute.hh
+++ b/source/blender/blenkernel/BKE_attribute.hh
@@ -793,7 +793,9 @@ class CustomDataAttributes {
   ~CustomDataAttributes();
   CustomDataAttributes(const CustomDataAttributes &other);
   CustomDataAttributes(CustomDataAttributes &&other);
+
   CustomDataAttributes &operator=(const CustomDataAttributes &other);
+  CustomDataAttributes &operator=(CustomDataAttributes &&other);
 
   void reallocate(int size);
 
diff --git a/source/blender/blenkernel/intern/attribute_access.cc b/source/blender/blenkernel/intern/attribute_access.cc
index b86353bdb74..544427cfdd3 100644
--- a/source/blender/blenkernel/intern/attribute_access.cc
+++ b/source/blender/blenkernel/intern/attribute_access.cc
@@ -642,15 +642,26 @@ CustomDataAttributes::CustomDataAttributes(CustomDataAttributes &&other)
   size_ = other.size_;
   data = other.data;
   CustomData_reset(&other.data);
+  other.size_ = 0;
 }
 
 CustomDataAttributes &CustomDataAttributes::operator=(const CustomDataAttributes &other)
 {
-  if (this != &other) {
-    CustomData_copy(&other.data, &data, CD_MASK_ALL, CD_DUPLICATE, other.size_);
-    size_ = other.size_;
+  if (this == &other) {
+    return *this;
   }
+  this->~CustomDataAttributes();
+  new (this) CustomDataAttributes(other);
+  return *this;
+}
 
+CustomDataAttributes &CustomDataAttributes::operator=(CustomDataAttributes &&other)
+{
+  if (this == &other) {
+    return *this;
+  }
+  this->~CustomDataAttributes();
+  new (this) CustomDataAttributes(std::move(other));
   return *this;
 }



More information about the Bf-blender-cvs mailing list