From 95895823f75108cbfed2697498e4e097f493b236 Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Mon, 19 Oct 2009 00:49:29 +0000 Subject: Fix some memory leaks. dmnsn_delete_pigment() was not using the free_fn, and kD splay trees were not being deleted after raytracing finished. --- libdimension/kD_splay_tree.c | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) (limited to 'libdimension/kD_splay_tree.c') diff --git a/libdimension/kD_splay_tree.c b/libdimension/kD_splay_tree.c index de70edf..a661602 100644 --- a/libdimension/kD_splay_tree.c +++ b/libdimension/kD_splay_tree.c @@ -29,10 +29,11 @@ dmnsn_kD_splay_tree * dmnsn_new_kD_splay_tree() { dmnsn_kD_splay_tree *tree = malloc(sizeof(dmnsn_kD_splay_tree)); - if (!tree) { + if (tree) { + tree->root = NULL; + } else { dmnsn_error(DMNSN_SEVERITY_HIGH, "kD splay tree allocation failed."); } - tree->root = NULL; return tree; } @@ -67,20 +68,25 @@ dmnsn_kD_splay_copy(dmnsn_kD_splay_tree *tree) /* Recursively free a kD splay tree */ void -dmnsn_delete_kD_splay_tree(dmnsn_kD_splay_tree *tree) +dmnsn_delete_kD_splay_tree_recursive(dmnsn_kD_splay_node *node) { - dmnsn_kD_splay_node *node = tree->root; if (node) { - tree->root = node->contains; - dmnsn_delete_kD_splay_tree(tree); - - tree->root = node->container; - dmnsn_delete_kD_splay_tree(tree); - + dmnsn_delete_kD_splay_tree_recursive(node->contains); + dmnsn_delete_kD_splay_tree_recursive(node->container); dmnsn_delete_kD_splay_node(node); } } +/* Free a kD splay tree */ +void +dmnsn_delete_kD_splay_tree(dmnsn_kD_splay_tree *tree) +{ + if (tree) { + dmnsn_delete_kD_splay_tree_recursive(tree->root); + free(tree); + } +} + /* Return whether node1 contains node2 */ static int dmnsn_box_contains(dmnsn_vector p, dmnsn_vector min, dmnsn_vector max); -- cgit v1.2.3