Fix memory leaks in FACTOR/MATRIX
authorJohn Darrington <john@darrington.wattle.id.au>
Wed, 10 May 2017 14:43:39 +0000 (16:43 +0200)
committerJohn Darrington <john@darrington.wattle.id.au>
Wed, 10 May 2017 14:43:39 +0000 (16:43 +0200)
src/language/data-io/matrix-reader.c
src/language/stats/factor.c

index 2c0aee2fec825cdec389ae45ec38d8c8ec343013..65e3cf4d08cd59219e65fec3211ec875c841c026 100644 (file)
@@ -186,8 +186,6 @@ next_matrix_from_reader (struct matrix_material *mm,
   gsl_matrix_free (mr->n_vectors);
   gsl_matrix_free (mr->mean_vectors);
   gsl_matrix_free (mr->var_vectors);
-  gsl_matrix_free (mr->correlation);
-  gsl_matrix_free (mr->covariance);
 
   if (!casegrouper_get_next_group (mr->grouper, &group))
     return false;
@@ -200,9 +198,6 @@ next_matrix_from_reader (struct matrix_material *mm,
   mm->mean_matrix = mr->mean_vectors;
   mm->var_matrix = mr->var_vectors;
 
-  mr->correlation  = NULL;
-  mr->covariance   = NULL;
-
   // FIXME: Make this into a hash table.
   unsigned long *table = xmalloc (sizeof (*table) * n_vars);
   int i;
index 9480b3a17a8ccc9947891e24a521c64d0e31c2d3..ae42d406a6d9b17cead82e7cb2276e978c3ffda3 100644 (file)
@@ -266,10 +266,6 @@ idata_free (struct idata *id)
   gsl_vector_free (id->msr);
   gsl_vector_free (id->eval);
   gsl_matrix_free (id->evec);
-  if (id->mm.cov != NULL)
-    gsl_matrix_free (id->mm.cov);
-  if (id->mm.corr != NULL)
-    gsl_matrix_free (CONST_CAST (gsl_matrix *, id->mm.corr));
 
   free (id);
 }
@@ -1480,7 +1476,9 @@ cmd_factor (struct lexer *lexer, struct dataset *ds)
        {
          do_factor_by_matrix (&factor, id);
 
+         gsl_matrix_free (id->mm.corr);
          id->mm.corr = NULL;
+         gsl_matrix_free (id->mm.cov);
          id->mm.cov = NULL;
        }
 
@@ -2215,6 +2213,9 @@ do_factor (const struct cmd_factor *factor, struct casereader *r)
   do_factor_by_matrix (factor, idata);
 
  finish:
+  gsl_matrix_free (idata->mm.corr);
+  gsl_matrix_free (idata->mm.cov);
+
   idata_free (idata);
   casereader_destroy (r);
 }