GLM: Fix memory leaks
authorJohn Darrington <john@darrington.wattle.id.au>
Thu, 7 Jul 2011 10:14:29 +0000 (12:14 +0200)
committerJohn Darrington <john@darrington.wattle.id.au>
Tue, 26 Jul 2011 10:36:37 +0000 (12:36 +0200)
src/language/stats/glm.c
src/math/categoricals.c

index 4ba93150c496db428ece611c79f7a149277e10b2..ba978c0addc4edc1e59f05b46e63c586b792bf62 100644 (file)
@@ -63,7 +63,7 @@ struct glm_spec
   const struct variable **design_vars;
 
   size_t n_interactions;
-  const struct interaction **interactions;
+  struct interaction **interactions;
 
   enum mv_class exclude;
 
@@ -104,6 +104,7 @@ static bool parse_design_spec (struct lexer *lexer, struct glm_spec *glm);
 int
 cmd_glm (struct lexer *lexer, struct dataset *ds)
 {
+  int i;
   struct const_var_set *factors = NULL;
   struct glm_spec glm;
   bool design = false;
@@ -293,8 +294,11 @@ cmd_glm (struct lexer *lexer, struct dataset *ds)
 
   const_var_set_destroy (factors);
   free (glm.factor_vars);
+  for (i = 0 ; i < glm.n_interactions; ++i)
+    interaction_destroy (glm.interactions[i]);
   free (glm.interactions);
   free (glm.dep_vars);
+  free (glm.design_vars);
 
 
   return CMD_SUCCESS;
@@ -303,8 +307,12 @@ error:
 
   const_var_set_destroy (factors);
   free (glm.factor_vars);
+  for (i = 0 ; i < glm.n_interactions; ++i)
+    interaction_destroy (glm.interactions[i]);
+
   free (glm.interactions);
   free (glm.dep_vars);
+  free (glm.design_vars);
 
   return CMD_FAILURE;
 }
index 58015c9088c891653329765a9cfc215f67b6b9e8..a3078d36384208024f92379c41e5b6a3dd85344f 100644 (file)
@@ -125,7 +125,17 @@ categoricals_destroy ( struct categoricals *cat)
   if (cat != NULL)
     {
       for (i = 0 ; i < cat->n_vp; ++i)
-       hmap_destroy (&cat->vp[i].map);
+       {
+         struct hmap *map = &cat->vp[i].map;
+         struct value_node *nn;
+
+         HMAP_FOR_EACH (nn, struct value_node, node, map)
+           {
+             case_unref (nn->ccase);
+           }     
+         
+         hmap_destroy (map);
+       }
       
       pool_destroy (cat->pool);
       free (cat);