]> granicus.if.org Git - postgis/commitdiff
Try and ensure clean memory into kmeans algorithm
authorPaul Ramsey <pramsey@cleverelephant.ca>
Mon, 11 Sep 2017 18:45:31 +0000 (18:45 +0000)
committerPaul Ramsey <pramsey@cleverelephant.ca>
Mon, 11 Sep 2017 18:45:31 +0000 (18:45 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@15692 b70326c6-7e19-0410-871a-916f4a2858ee

liblwgeom/lwkmeans.c

index 7500c946415b680cacf0aca112c466ee377115de..1a37123b7f3fce2cb004537359cd02872f9c8f91 100644 (file)
@@ -93,6 +93,10 @@ lwgeom_cluster_2d_kmeans(const LWGEOM **geoms, int ngeoms, int k)
        assert(ngeoms>0);
        assert(geoms);
        
+    /* Initialize our static structs */
+    memset(&config, 0, sizeof(kmeans_config));
+    memset(&result, 0, sizeof(kmeans_result));
+    
        if (ngeoms<k)
        {
                lwerror("%s: number of geometries is less than the number of clusters requested", __func__);
@@ -100,11 +104,13 @@ lwgeom_cluster_2d_kmeans(const LWGEOM **geoms, int ngeoms, int k)
 
        /* We'll hold the temporary centroid objects here */
        centroids = lwalloc(sizeof(LWGEOM*) * ngeoms);
+       memset(centroids, 0, sizeof(LWGEOM*) * ngeoms);
 
        /* The vector of cluster means. We have to allocate a */
        /* chunk of memory for these because we'll be mutating them */
        /* in the kmeans algorithm */
        centers_raw = lwalloc(sizeof(POINT2D) * k);
+       memset(centers_raw, 0, sizeof(POINT2D) * k);
 
        /* K-means configuration setup */
        config.objs = lwalloc(sizeof(Pointer) * ngeoms);
@@ -170,6 +176,7 @@ lwgeom_cluster_2d_kmeans(const LWGEOM **geoms, int ngeoms, int k)
        dx = (max.x - min.x)/k;
        dy = (max.y - min.y)/k;
        seen = lwalloc(sizeof(int)*config.k);
+       memset(seen, 0, sizeof(int)*config.k);
        for (i = 0; i < k; i++)
        {
                int closest;