From: Matthew Fernandez Date: Sat, 8 Jan 2022 18:57:35 +0000 (-0800) Subject: nearest_neighbor_graph: remove manual memory management X-Git-Tag: 3.0.0~74^2~2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=917dbc80154980a6f5d7852e79c4aafec00895df;p=graphviz nearest_neighbor_graph: remove manual memory management Gitlab: #2154 --- diff --git a/lib/mingle/nearest_neighbor_graph.cpp b/lib/mingle/nearest_neighbor_graph.cpp index d1b9df67e..17690cfa7 100644 --- a/lib/mingle/nearest_neighbor_graph.cpp +++ b/lib/mingle/nearest_neighbor_graph.cpp @@ -14,6 +14,7 @@ #include #include #include +#include SparseMatrix nearest_neighbor_graph(int nPts, int num_neigbors, double *x, double eps){ /* Gives a nearest neighbor graph of a list of dim-dimendional points. The result is a sparse matrix @@ -26,27 +27,25 @@ SparseMatrix nearest_neighbor_graph(int nPts, int num_neigbors, double *x, doubl x: nPts*dim vector. The i-th point is x[i*dim : i*dim + dim - 1] */ - int *irn = NULL, *jcn = NULL, nz; - double *val = NULL; + int nz; SparseMatrix A; int k = num_neigbors; +#ifdef HAVE_ANN /* need to *2 as we do two sweeps of neighbors, so could have repeats */ - irn = (int*)MALLOC(sizeof(int)*nPts*k*2); - jcn = (int*)MALLOC(sizeof(int)*nPts*k*2); - val = (double*)MALLOC(sizeof(double)*nPts*k*2); + std::vector irn(nPts * k * 2); + std::vector jcn(nPts * k * 2); + std::vector val(nPts * k * 2); -#ifdef HAVE_ANN - nearest_neighbor_graph_ann(nPts, num_neigbors, eps, x, &nz, irn, jcn, val); + nearest_neighbor_graph_ann(nPts, num_neigbors, eps, x, &nz, irn.data(), + jcn.data(), val.data()); - A = SparseMatrix_from_coordinate_arrays(nz, nPts, nPts, irn, jcn, val, MATRIX_TYPE_REAL, sizeof(double)); + A = SparseMatrix_from_coordinate_arrays(nz, nPts, nPts, irn.data(), + jcn.data(), val.data(), + MATRIX_TYPE_REAL, sizeof(double)); #else A = NULL; #endif - free(irn); - free(jcn); - free(val); - return A; }