[geos-commits] r2540 - in trunk/source: algorithm/locate headers/geos/algorithm/locate headers/geos/index/intervalrtree

svn_geos at osgeo.org svn_geos at osgeo.org
Fri Jun 5 05:28:04 EDT 2009


Author: strk
Date: 2009-06-05 05:28:04 -0400 (Fri, 05 Jun 2009)
New Revision: 2540

Modified:
   trunk/source/algorithm/locate/IndexedPointInAreaLocator.cpp
   trunk/source/headers/geos/algorithm/locate/IndexedPointInAreaLocator.h
   trunk/source/headers/geos/index/intervalrtree/IntervalRTreeLeafNode.h
   trunk/source/headers/geos/index/intervalrtree/SortedPackedIntervalRTree.h
Log:
Fix deletion of void pointer in IntervalRTreeLeafNode, document ownership, fix callers tracking allocations to avoid leaks. Fixes bug #227.


Modified: trunk/source/algorithm/locate/IndexedPointInAreaLocator.cpp
===================================================================
--- trunk/source/algorithm/locate/IndexedPointInAreaLocator.cpp	2009-06-05 09:15:57 UTC (rev 2539)
+++ trunk/source/algorithm/locate/IndexedPointInAreaLocator.cpp	2009-06-05 09:28:04 UTC (rev 2540)
@@ -45,6 +45,11 @@
 IndexedPointInAreaLocator::IntervalIndexedGeometry::~IntervalIndexedGeometry( )
 {
 	delete index;
+
+	for ( size_t i = 0, ni = allocatedSegments.size(); i < ni; ++i ) 
+	{
+		delete allocatedSegments[i];
+	}
 }
 
 void 
@@ -70,10 +75,11 @@
 	for ( size_t i = 1, ni = pts->size(); i < ni; i++ ) 
 	{
 		geom::LineSegment * seg = new geom::LineSegment( (*pts)[ i - 1 ], (*pts)[ i ]);
-
 		double min = std::min( seg->p0.y, seg->p1.y);
 		double max = std::max( seg->p0.y, seg->p1.y);
 		
+		// NOTE: seg ownership still ours
+		allocatedSegments.push_back(seg);
 		index->insert( min, max, seg);
 	}
 } 

Modified: trunk/source/headers/geos/algorithm/locate/IndexedPointInAreaLocator.h
===================================================================
--- trunk/source/headers/geos/algorithm/locate/IndexedPointInAreaLocator.h	2009-06-05 09:15:57 UTC (rev 2539)
+++ trunk/source/headers/geos/algorithm/locate/IndexedPointInAreaLocator.h	2009-06-05 09:28:04 UTC (rev 2540)
@@ -20,6 +20,8 @@
 #include <geos/algorithm/locate/PointOnGeometryLocator.h> // inherited
 #include <geos/index/ItemVisitor.h> // inherited
 
+#include <vector> // composition
+
 namespace geos {
 	namespace algorithm {
 		class RayCrossingCounter;
@@ -28,6 +30,7 @@
 		class Geometry;
 		class Coordinate; 
 		class CoordinateSequence; 
+		class LineSegment;
 	}
 	namespace index {
 		namespace intervalrtree {
@@ -61,6 +64,9 @@
 		void init( const geom::Geometry & g);
 		void addLine( geom::CoordinateSequence * pts);
 
+		// To keep track of allocated LineSegments
+		std::vector< geom::LineSegment* > allocatedSegments;
+
 	public:
 		IntervalIndexedGeometry( const geom::Geometry & g);
 		~IntervalIndexedGeometry();
@@ -109,7 +115,7 @@
 	 * @return the location of the point in the geometry  
 	 */
 	int locate( const geom::Coordinate * /*const*/ p);
-    
+
 };
 
 } // geos::algorithm::locate

Modified: trunk/source/headers/geos/index/intervalrtree/IntervalRTreeLeafNode.h
===================================================================
--- trunk/source/headers/geos/index/intervalrtree/IntervalRTreeLeafNode.h	2009-06-05 09:15:57 UTC (rev 2539)
+++ trunk/source/headers/geos/index/intervalrtree/IntervalRTreeLeafNode.h	2009-06-05 09:28:04 UTC (rev 2540)
@@ -36,10 +36,13 @@
 class IntervalRTreeLeafNode : public IntervalRTreeNode
 {
 private:
+	/// externally owned
 	void * item;
 
 protected:
 public:
+
+	/// @param item externally owned
 	IntervalRTreeLeafNode( double min, double max, void * item)
 	:	IntervalRTreeNode( min, max),
 		item( item)
@@ -47,7 +50,6 @@
 
 	~IntervalRTreeLeafNode()
 	{
-		delete item;
 	}
 	
 	void query( double queryMin, double queryMax, index::ItemVisitor * visitor) const;

Modified: trunk/source/headers/geos/index/intervalrtree/SortedPackedIntervalRTree.h
===================================================================
--- trunk/source/headers/geos/index/intervalrtree/SortedPackedIntervalRTree.h	2009-06-05 09:15:57 UTC (rev 2539)
+++ trunk/source/headers/geos/index/intervalrtree/SortedPackedIntervalRTree.h	2009-06-05 09:28:04 UTC (rev 2540)
@@ -45,6 +45,7 @@
  * can be optimized based on a fixed set of items.
  * 
  * @author Martin Davis
+ *
  */
 class SortedPackedIntervalRTree 
 {
@@ -68,7 +69,7 @@
 	 * 
 	 * @param min the lower bound of the item interval
 	 * @param max the upper bound of the item interval
-	 * @param item the item to insert
+	 * @param item the item to insert, ownership left to caller
 	 * 
 	 * @throw IllegalStateException if the index has already been queried
 	 */



More information about the geos-commits mailing list