[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