[Bf-blender-cvs] [0b8514a99cb] functions: fix memory leak

Jacques Lucke noreply at git.blender.org
Fri Sep 6 16:56:00 CEST 2019


Commit: 0b8514a99cbb0ba64c7627633ef94576cf052891
Author: Jacques Lucke
Date:   Fri Sep 6 15:32:04 2019 +0200
Branches: functions
https://developer.blender.org/rB0b8514a99cbb0ba64c7627633ef94576cf052891

fix memory leak

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

M	source/blender/blenkernel/BKE_falloff.hpp
M	source/blender/simulations/bparticles/particle_function.cpp
M	source/blender/simulations/bparticles/particle_function.hpp

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

diff --git a/source/blender/blenkernel/BKE_falloff.hpp b/source/blender/blenkernel/BKE_falloff.hpp
index f1f96398624..f3ba0d1d572 100644
--- a/source/blender/blenkernel/BKE_falloff.hpp
+++ b/source/blender/blenkernel/BKE_falloff.hpp
@@ -6,6 +6,10 @@ namespace BKE {
 
 class Falloff {
  public:
+#ifdef WITH_CXX_GUARDEDALLOC
+  MEM_CXX_CLASS_ALLOC_FUNCS("BKE:Falloff")
+#endif
+
   virtual ~Falloff()
   {
   }
diff --git a/source/blender/simulations/bparticles/particle_function.cpp b/source/blender/simulations/bparticles/particle_function.cpp
index 89d059c8049..463ed83a32c 100644
--- a/source/blender/simulations/bparticles/particle_function.cpp
+++ b/source/blender/simulations/bparticles/particle_function.cpp
@@ -97,6 +97,7 @@ std::unique_ptr<ParticleFunctionResult> ParticleFunction::compute(ArrayRef<uint>
   result->m_fn_no_deps = m_fn_no_deps.ptr();
   result->m_fn_with_deps = m_fn_with_deps.ptr();
   result->m_output_indices = m_output_indices;
+  result->m_pindices = pindices;
 
   this->init_without_deps(result);
   this->init_with_deps(result, pindices, attributes, particle_times, action_context);
diff --git a/source/blender/simulations/bparticles/particle_function.hpp b/source/blender/simulations/bparticles/particle_function.hpp
index c3695f2557c..4d255c0f8d4 100644
--- a/source/blender/simulations/bparticles/particle_function.hpp
+++ b/source/blender/simulations/bparticles/particle_function.hpp
@@ -31,6 +31,7 @@ class ParticleFunctionResult {
   FN::Function *m_fn_no_deps;
   FN::Function *m_fn_with_deps;
   ArrayRef<uint> m_output_indices;
+  ArrayRef<uint> m_pindices;
 
   friend ParticleFunction;
 
@@ -41,6 +42,26 @@ class ParticleFunctionResult {
 
   ~ParticleFunctionResult()
   {
+    /* Free elements in buffers. */
+    for (uint i = 0; i < m_only_first.size(); i++) {
+      uint output_index = m_output_indices[i];
+      if (m_only_first[i]) {
+        auto &type_info = m_fn_no_deps->output_type(output_index)->extension<CPPTypeInfo>();
+        void *ptr = m_buffers[i];
+        type_info.destruct(ptr);
+      }
+      else {
+        auto &type_info = m_fn_with_deps->output_type(output_index)->extension<CPPTypeInfo>();
+        if (!type_info.trivially_destructible()) {
+          void *ptr = m_buffers[i];
+          for (uint pindex : m_pindices) {
+            type_info.destruct(POINTER_OFFSET(ptr, type_info.size() * pindex));
+          }
+        }
+      }
+    }
+
+    /* Free buffers. */
     for (uint i = 0; i < m_buffers.size(); i++) {
       BLI_temporary_deallocate(m_buffers[i]);
     }



More information about the Bf-blender-cvs mailing list