[geos-devel] Potential memory leak in GEOSTopologyPreserveSimplify
Bill Zissimopoulos
geos at billz.fastmail.fm
Thu Jan 31 01:27:31 EST 2008
I have spent time investigating this memory leak and produced a patch
that I believe fixes it. The patch is included in this mail.
The GEOS tests (make check) pass with this patch. However in one of my
private tests I found a one point difference in the simplified polyline
produced with and without the patch (one point missing with this patch).
Because the resulting polyline looks correct to me I decided to
incorporate the patch, however your decision may be different.
I would much appreciate it if someone more knowledgeable than I gave the
patch a look. Thank you.
Bill
diff -Naur geos-3.0.0/source/index/quadtree/NodeBase.cpp
geos-3.0.0.new/source/index/quadtree/NodeBase.cpp
--- geos-3.0.0/source/index/quadtree/NodeBase.cpp 2007-12-12
13:59:26.000000000 -0800
+++ geos-3.0.0.new/source/index/quadtree/NodeBase.cpp 2008-01-30
20:59:05.000000000 -0800
@@ -215,7 +215,10 @@
if (found) {
// trim subtree if empty
if (subnode[i]->isPrunable())
- subnode[i] = NULL;
+ {
+ delete subnode[i];
+ subnode[i] = NULL;
+ }
break;
}
}
diff -Naur geos-3.0.0/source/index/quadtree/Quadtree.cpp
geos-3.0.0.new/source/index/quadtree/Quadtree.cpp
--- geos-3.0.0/source/index/quadtree/Quadtree.cpp 2007-12-12
13:59:26.000000000 -0800
+++ geos-3.0.0.new/source/index/quadtree/Quadtree.cpp 2008-01-30
20:59:05.000000000 -0800
@@ -142,7 +142,10 @@
Quadtree::remove(const Envelope* itemEnv, void* item)
{
Envelope* posEnv = ensureExtent(itemEnv, minExtent);
- return root->remove(posEnv, item);
+ bool result = root->remove(posEnv, item);
+ if (itemEnv != posEnv)
+ delete posEnv;
+ return result;
}
/*private*/
More information about the geos-devel
mailing list