From 36630b7e854ba69520aab9be411361589eb3ce83 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 24 Jul 2015 05:04:33 +1000 Subject: Fix memory leaks mesh w/ mesh remapping --- source/blender/blenkernel/intern/mesh_mapping.c | 18 ++++++++++++++++-- source/blender/blenkernel/intern/mesh_remap.c | 12 ++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/source/blender/blenkernel/intern/mesh_mapping.c b/source/blender/blenkernel/intern/mesh_mapping.c index c03f1feef9c..ef9136397fa 100644 --- a/source/blender/blenkernel/intern/mesh_mapping.c +++ b/source/blender/blenkernel/intern/mesh_mapping.c @@ -797,8 +797,8 @@ bool BKE_mesh_calc_islands_loop_poly_uv( /* Those are used to detect 'inner cuts', i.e. edges that are borders, and yet have two or more polys of * a same group using them (typical case: seam used to unwrap properly a cylinder). */ - BLI_bitmap *edge_borders; - int num_edge_borders; + BLI_bitmap *edge_borders = NULL; + int num_edge_borders = 0; char *edge_border_count = NULL; int *edge_innercut_indices = NULL; int num_einnercuts = 0; @@ -817,6 +817,12 @@ bool BKE_mesh_calc_islands_loop_poly_uv( if (!num_poly_groups) { /* Should never happen... */ + MEM_freeN(edge_poly_map); + MEM_freeN(edge_poly_mem); + + if (edge_borders) { + MEM_freeN(edge_borders); + } return false; } @@ -861,9 +867,17 @@ bool BKE_mesh_calc_islands_loop_poly_uv( num_einnercuts, edge_innercut_indices); } + MEM_freeN(edge_poly_map); + MEM_freeN(edge_poly_mem); + MEM_freeN(poly_indices); MEM_freeN(loop_indices); MEM_freeN(poly_groups); + + if (edge_borders) { + MEM_freeN(edge_borders); + } + if (num_edge_borders) { MEM_freeN(edge_border_count); MEM_freeN(edge_innercut_indices); diff --git a/source/blender/blenkernel/intern/mesh_remap.c b/source/blender/blenkernel/intern/mesh_remap.c index ec8b3627321..978ea37a8cc 100644 --- a/source/blender/blenkernel/intern/mesh_remap.c +++ b/source/blender/blenkernel/intern/mesh_remap.c @@ -1933,15 +1933,27 @@ void BKE_mesh_remap_calc_loops_from_dm( if (looptri_allocated_src) { MEM_freeN((void *)looptri_src); } + if (vert_to_loop_map_src) { + MEM_freeN(vert_to_loop_map_src); + } if (vert_to_loop_map_src_buff) { MEM_freeN(vert_to_loop_map_src_buff); } + if (vert_to_poly_map_src) { + MEM_freeN(vert_to_poly_map_src); + } if (vert_to_poly_map_src_buff) { MEM_freeN(vert_to_poly_map_src_buff); } + if (edge_to_poly_map_src) { + MEM_freeN(edge_to_poly_map_src); + } if (edge_to_poly_map_src_buff) { MEM_freeN(edge_to_poly_map_src_buff); } + if (poly_to_looptri_map_src) { + MEM_freeN(poly_to_looptri_map_src); + } if (poly_to_looptri_map_src_buff) { MEM_freeN(poly_to_looptri_map_src_buff); } -- cgit v1.2.3