[geos-devel] using CoordinateOperation::edit cause memory leaks

Sandro Santilli strk at keybit.net
Thu May 16 01:43:29 PDT 2013


What I need is a full contained test.
A .cpp file that built and run exposes the leak.
It must include the geometry input.

--strk;

On Wed, May 15, 2013 at 10:42:08PM +0200, Tereza Fiedlerová wrote:
> 2013/5/13 Sandro Santilli <strk at keybit.net>:
> >
> > Hi Tereza, could you include a full testcase, including caller ?
> >
> > --strk;
> 
> Hi,
> 
> I tried to make it easier, but I see it wasn't good idea, so I'm
> giving here the necessary code without changes:
> 
> vertexgeometryeditoroperation.h
> --------------------------------
> 
> #ifndef VERTEXGEOMETRYEDITOROPERATION_H
> #define VERTEXGEOMETRYEDITOROPERATION_H
> 
> // GEOS includes
> #include <geos/geom/CoordinateSequence.h>
> #include <geos/geom/Geometry.h>
> #include <geos/geom/util/CoordinateOperation.h>
> #include <geos/geom/CoordinateSequenceFactory.h>
> 
> // local includes
> #include "geoc.h"
> 
> #include <QtGui>
> 
> using namespace std;
> using namespace geos;
> using namespace geos::geom;
> using namespace geos::geom::util;
> 
> using namespace geoc;
> using namespace geoc::geo;
> using namespace geoc::alg;
> using namespace geoc::edit;
> 
> namespace geoc {
> namespace edit {
> 
> /** Class for editing geometry - snap vertices to the closest points. */
> 
> class VertexGeometryEditorOperation: public CoordinateOperation
> {
> 
>     using CoordinateOperation::edit;
> 
> public:
> 
>     /// Constructor
>     VertexGeometryEditorOperation(  ): closeCoord(NULL),
> tolDistance(0), changed(false){}
> 
>     /** Set private closeCoord to given coord.
>      */
>     void setCloseCoordSeq( CoordinateSequence *coord ) { closeCoord = coord; }
> 
>     /** Set tolerance distance
>       */
>     void setTolDistance( double tol ) { tolDistance = tol; }
> 
>     /** Return true if geometry was changed
>       */
>     bool isChanged() { return changed; }
> 
>     /** Virtual function for editing geometry - snap to closest vertices.
>      * @param coordinates Not important.
>      * @param gGeometry to be edited.
>      */
>     CoordinateSequence* edit(const CoordinateSequence *coordinates,
> const Geometry *g );
> 
> 
> private:
> 
>     CoordinateSequence *closeCoord;
>     double tolDistance;
>     bool changed;
> 
> };
> 
> } //namespace geoc
> } //namespace edit
> 
> #endif // VERTEXGEOMETRYEDITOROPERATION_H
> 
> 
> ------------------------------
> vertexgeometryoperation.cpp
> ------------------------------
> 
> #include "vertexgeometryeditoroperation.h"
> 
> namespace geoc {
> namespace edit {
> 
> CoordinateSequence* VertexGeometryEditorOperation::edit(const
> CoordinateSequence *, const Geometry *geom )
> {
>     CoordinateSequence* coord = geom->getCoordinates();
> 
>     // find closest point from closeCoord
>     for ( size_t i = 0; i < coord->getSize(); i++)
>     {
>         // minimal distance
>         double minDist = tolDistance;
>         size_t indMin = 0;
>         bool isMin = false;
> 
>         for ( size_t j = 0; j < closeCoord->getSize(); j++ )
>         {
>             // compute distance between two tested points
>             double dist = coord->getAt(i).distance( closeCoord->getAt(j) );
> 
>             if( (0 < dist) && (dist < minDist) )
>             {
>                 minDist = dist;
>                 indMin = j;
>                 isMin = true;
>             }
> 
>         }
> 
>         // set new coordinate to the closest point if there is some
>         if ( isMin )
>         {
>             coord->setAt( closeCoord->getAt(indMin), i );
>             changed = true;
>         }
> 
>     }
> 
>     return coord;
> 
> }
> 
> } //namespace geoc
> } //namespace edit
> 
> 
> --------------------------
> function using code above
> --------------------------
> 
> void VertexSnapper::snapVertices(Geometry *geom, CoordinateSequence *closeCoord)
> {
> 
>     // create and set geometry editor
>     VertexGeometryEditorOperation myOp;
>     myOp.setCloseCoordSeq( closeCoord );
>     myOp.setTolDistance( tolDistance );
> 
>     GeometryEditor geomEdit( geom->getFactory() );
> 
>     // set geometry to edited one
>     geom=( geomEdit.edit( geom , &myOp ) );
> 
> 
> }
> 
> 
> Thanks for help in advance,


More information about the geos-devel mailing list