[geos-commits] r4101 - branches/3.5/src/operation/buffer

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


Author: strk
Date: 2015-10-04 09:08:31 -0700 (Sun, 04 Oct 2015)
New Revision: 4101

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

See #747

Modified: branches/3.5/src/operation/buffer/BufferBuilder.cpp
===================================================================
--- branches/3.5/src/operation/buffer/BufferBuilder.cpp	2015-10-04 14:09:49 UTC (rev 4100)
+++ branches/3.5/src/operation/buffer/BufferBuilder.cpp	2015-10-04 16:08:31 UTC (rev 4101)
@@ -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,11 +159,11 @@
    // 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.
-   Geometry* bufLineString = buf->getBoundary();
+   std::auto_ptr<Geometry> bufLineString ( buf->getBoundary() );
 
 #ifdef GEOS_DEBUG_SSB
    std::cerr << "input|" << *l << std::endl;
@@ -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,10 +338,10 @@
 
    // Clean up.
    if ( noder != workingNoder ) delete noder;
-   geomFact->destroyGeometry( buf );
-   geomFact->destroyGeometry( bufLineString );
-   geomFact->destroyGeometry( singleSided );
-   geomFact->destroyGeometry( intersectedLines );
+   buf.reset();
+   bufLineString.reset();
+   singleSided.reset();
+   intersectedLines.reset();
 
    if ( mergedLinesGeom->size() > 1 )
    {      



More information about the geos-commits mailing list