[Bf-blender-cvs] [bc99752] fracture_modifier: closed some memory leaks when calculating shard mass and after fracture (C++ cell struct)

Martin Felke noreply at git.blender.org
Wed Oct 8 21:27:21 CEST 2014


Commit: bc99752aa2ebdb4771e7ef1b03bd0f39f8c5e989
Author: Martin Felke
Date:   Wed Oct 8 21:27:11 2014 +0200
Branches: fracture_modifier
https://developer.blender.org/rBbc99752aa2ebdb4771e7ef1b03bd0f39f8c5e989

closed some memory leaks when calculating shard mass and after fracture (C++ cell struct)

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

M	extern/voro++/src/c_interface.cc
M	source/blender/blenkernel/intern/rigidbody.c

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

diff --git a/extern/voro++/src/c_interface.cc b/extern/voro++/src/c_interface.cc
index 75c4b22..3ebf9cb 100644
--- a/extern/voro++/src/c_interface.cc
+++ b/extern/voro++/src/c_interface.cc
@@ -165,12 +165,22 @@ void cells_free(cell *cells, int totcells)
 {
 	// XXX TODO free properly !
 	if (cells) {
-		int i = 0;
+		int i = 0, j = 0;
 		for (i = 0; i < totcells; i++) {
 			cell c = cells[i];
-			if (c.verts) delete [] c.verts;
+			if (c.verts)
+			{
+				delete [] c.verts;
+			}
 			if (c.neighbors) delete [] c.neighbors;
-			if (c.poly_indices) delete [] c.poly_indices;
+			if (c.poly_indices)
+			{
+				for (j = 0; j < c.totpoly; j++)
+				{
+					delete [] c.poly_indices[j];
+				}
+				delete [] c.poly_indices;
+			}
 			if (c.poly_totvert) delete [] c.poly_totvert;
 		}
 		delete [] cells;
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index 4f698fd..2f0a488 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -337,6 +337,13 @@ void BKE_rigidbody_calc_shard_mass(Object *ob, MeshIsland* mi, DerivedMesh* orig
 	if ((mi->rigidbody->physics_object) && (mi->rigidbody->type == RBO_TYPE_ACTIVE)) {
 		RB_body_set_mass(mi->rigidbody->physics_object, RBO_GET_MASS(mi->rigidbody));
 	}
+
+	if (orig_dm == NULL && dm_ob != NULL)
+	{
+		/* free temp dm, if it hasnt been passed in */
+		dm_ob->needsFree = 1;
+		dm_ob->release(dm_ob);
+	}
 }
 
 static void initNormals(struct MeshIsland* mi, Object* ob, FractureModifierData* fmd)




More information about the Bf-blender-cvs mailing list