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;
 }

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
List details, subscription details or unsubscribe:
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to