[geos-commits] r3454 - trunk/src/operation/buffer
svn_geos at osgeo.org
svn_geos at osgeo.org
Wed Jul 27 09:29:36 EDT 2011
Author: strk
Date: 2011-07-27 06:29:36 -0700 (Wed, 27 Jul 2011)
New Revision: 3454
Modified:
trunk/src/operation/buffer/BufferBuilder.cpp
Log:
Earlier release of input segment strings, earlier release of buffer subgraphs.
Modified: trunk/src/operation/buffer/BufferBuilder.cpp
===================================================================
--- trunk/src/operation/buffer/BufferBuilder.cpp 2011-07-27 08:12:56 UTC (rev 3453)
+++ trunk/src/operation/buffer/BufferBuilder.cpp 2011-07-27 13:29:36 UTC (rev 3454)
@@ -375,6 +375,9 @@
// factory must be the same as the one used by the input
geomFact=g->getFactory();
+ { // This scope is here to force release of resources owned by
+ // OffsetCurveSetBuilder when we're doing with it
+
OffsetCurveBuilder curveBuilder(precisionModel, bufParams);
OffsetCurveSetBuilder curveSetBuilder(*g, distance, curveBuilder);
@@ -394,8 +397,9 @@
#endif
computeNodedEdges(bufferSegStrList, precisionModel);
- // NOTE: bufferSegStrList should not be needed anymore from now on
+ } // bufferSegStrList and contents are released here
+
#if GEOS_DEBUG > 1
std::cerr << std::endl << edgeList << std::endl;
#endif
@@ -409,6 +413,7 @@
graph.addEdges(edgeList.getEdges());
createSubgraphs(&graph, subgraphList);
+
#if GEOS_DEBUG
std::cerr<<"Created "<<subgraphList.size()<<" subgraphs"<<std::endl;
#if GEOS_DEBUG > 1
@@ -416,9 +421,18 @@
std::cerr << std::setprecision(10) << *(subgraphList[i]) << std::endl;
#endif
#endif
- PolygonBuilder polyBuilder(geomFact);
- buildSubgraphs(subgraphList, polyBuilder);
- resultPolyList.reset( polyBuilder.getPolygons() );
+
+ { // scope for earlier PolygonBuilder cleanupt
+ PolygonBuilder polyBuilder(geomFact);
+ buildSubgraphs(subgraphList, polyBuilder);
+
+ resultPolyList.reset( polyBuilder.getPolygons() );
+ }
+
+ // Get rid of the subgraphs, shouldn't be needed anymore
+ for (size_t i=0, n=subgraphList.size(); i<n; i++) delete subgraphList[i];
+ subgraphList.clear();
+
#if GEOS_DEBUG
std::cerr << "PolygonBuilder got " << resultPolyList->size()
<< " polygons" << std::endl;
@@ -427,25 +441,23 @@
std::cerr << (*resultPolyList)[i]->toString() << std::endl;
#endif
#endif
+
// just in case ...
- if ( resultPolyList->empty() )
- {
- for (size_t i=0, n=subgraphList.size(); i<n; i++)
- delete subgraphList[i];
- return createEmptyResultGeometry();
- }
+ if ( resultPolyList->empty() ) return createEmptyResultGeometry();
// resultPolyList ownership transferred here
resultGeom=geomFact->buildGeometry(resultPolyList.release());
+
} catch (const util::GEOSException& /* exc */) {
+
+ // In case they're still around
for (size_t i=0, n=subgraphList.size(); i<n; i++)
delete subgraphList[i];
+ subgraphList.clear();
+
throw;
}
- for (size_t i=0, n=subgraphList.size(); i<n; i++)
- delete subgraphList[i];
-
return resultGeom;
}
More information about the geos-commits
mailing list