[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