[geos-commits] r4103 - trunk/src/operation/buffer

svn_geos at osgeo.org svn_geos at osgeo.org
Sun Oct 4 09:09:41 PDT 2015


Author: strk
Date: 2015-10-04 09:09:41 -0700 (Sun, 04 Oct 2015)
New Revision: 4103

Modified:
   trunk/src/operation/buffer/BufferBuilder.cpp
Log:
Fix a few potential (one confirmed) leak in single sided buffer

See #747

Modified: trunk/src/operation/buffer/BufferBuilder.cpp
===================================================================
--- trunk/src/operation/buffer/BufferBuilder.cpp	2015-10-04 16:09:24 UTC (rev 4102)
+++ trunk/src/operation/buffer/BufferBuilder.cpp	2015-10-04 16:09:41 UTC (rev 4103)
@@ -151,7 +151,7 @@
    BufferParameters modParams = bufParams;
    modParams.setEndCapStyle(BufferParameters::CAP_FLAT); 
    modParams.setSingleSided(false); // ignore parameter for areal-only geometries
-   Geometry* buf = 0;
+   std::auto_ptr<Geometry> buf;
 
    // This is a (temp?) hack to workaround the fact that
    // BufferBuilder BufferParamaters are immutable after
@@ -159,7 +159,7 @@
    // style to FLAT for single-sided buffering
    {
       BufferBuilder tmp(modParams);
-      buf = tmp.buffer( l, distance );
+      buf.reset( tmp.buffer( l, distance ) );
    }
 
    // Create MultiLineStrings from this polygon.
@@ -219,8 +219,8 @@
    for (size_t i=0, n=curveList.size(); i<n; ++i) delete curveList[i];
    curveList.clear();
 
-   Geometry* singleSided = geomFact->createMultiLineString(
-      singleSidedNodedEdges );
+   std::auto_ptr<Geometry> singleSided ( geomFact->createMultiLineString(
+      singleSidedNodedEdges ) );
 
 #ifdef GEOS_DEBUG_SSB
      std::cerr << "edges|" << *singleSided << std::endl;
@@ -233,7 +233,7 @@
    //       diverge from original offset curves due to the addition of
    //       intersections with caps and joins curves
    using geos::operation::overlay::snap::SnapOverlayOp;
-   Geometry* intersectedLines = SnapOverlayOp::overlayOp(*singleSided, *bufLineString, OverlayOp::opINTERSECTION).release();
+   std::auto_ptr<Geometry> intersectedLines = SnapOverlayOp::overlayOp(*singleSided, *bufLineString, OverlayOp::opINTERSECTION);
 
 #ifdef GEOS_DEBUG_SSB
      std::cerr << "intersection" << "|" << *intersectedLines << std::endl;
@@ -241,7 +241,7 @@
 
    // Merge result lines together.
    LineMerger lineMerge;
-   lineMerge.add( intersectedLines );
+   lineMerge.add( intersectedLines.get() );
    std::auto_ptr< std::vector< LineString* > > mergedLines (
 	lineMerge.getMergedLineStrings() );
 
@@ -338,9 +338,9 @@
 
    // Clean up.
    if ( noder != workingNoder ) delete noder;
-   geomFact->destroyGeometry( buf );
-   geomFact->destroyGeometry( singleSided );
-   geomFact->destroyGeometry( intersectedLines );
+   buf.reset();
+   singleSided.reset();
+   intersectedLines.reset();
 
    if ( mergedLinesGeom->size() > 1 )
    {      



More information about the geos-commits mailing list