Skip to content

Commit ddea00e

Browse files
committedMay 23, 2019
Fix confusing memory management in dxf export
1 parent 11f6ba8 commit ddea00e

File tree

1 file changed

+51
-48
lines changed

1 file changed

+51
-48
lines changed
 

‎src/core/dxf/qgsdxfexport.cpp

Lines changed: 51 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -3722,13 +3722,13 @@ void QgsDxfExport::addFeature( QgsSymbolRenderContext &ctx, const QgsCoordinateT
37223722
if ( !fet->hasGeometry() )
37233723
return;
37243724

3725-
std::unique_ptr<QgsAbstractGeometry> geom( fet->geometry().constGet()->clone() );
3725+
QgsGeometry geom( fet->geometry() );
37263726
if ( ct.isValid() )
37273727
{
3728-
geom->transform( ct );
3728+
geom.transform( ct );
37293729
}
37303730

3731-
QgsWkbTypes::Type geometryType = geom->wkbType();
3731+
QgsWkbTypes::Type geometryType = geom.wkbType();
37323732

37333733
QColor penColor;
37343734
QColor brushColor;
@@ -3764,13 +3764,13 @@ void QgsDxfExport::addFeature( QgsSymbolRenderContext &ctx, const QgsCoordinateT
37643764
// single point
37653765
if ( QgsWkbTypes::flatType( geometryType ) == QgsWkbTypes::Point )
37663766
{
3767-
writePoint( geom->coordinateSequence().at( 0 ).at( 0 ).at( 0 ), layer, penColor, ctx, symbolLayer, symbol, angle );
3767+
writePoint( geom.constGet()->coordinateSequence().at( 0 ).at( 0 ).at( 0 ), layer, penColor, ctx, symbolLayer, symbol, angle );
37683768
return;
37693769
}
37703770

37713771
if ( QgsWkbTypes::flatType( geometryType ) == QgsWkbTypes::MultiPoint )
37723772
{
3773-
const QgsCoordinateSequence &cs = geom->coordinateSequence();
3773+
const QgsCoordinateSequence &cs = geom.constGet()->coordinateSequence();
37743774
for ( int i = 0; i < cs.size(); i++ )
37753775
{
37763776
writePoint( cs.at( i ).at( 0 ).at( 0 ), layer, penColor, ctx, symbolLayer, symbol, angle );
@@ -3780,49 +3780,52 @@ void QgsDxfExport::addFeature( QgsSymbolRenderContext &ctx, const QgsCoordinateT
37803780

37813781
if ( penStyle != Qt::NoPen )
37823782
{
3783-
const QgsAbstractGeometry *tempGeom = geom.get();
3783+
const QgsAbstractGeometry *sourceGeom = geom.constGet();
3784+
std::unique_ptr< QgsAbstractGeometry > tempGeom;
37843785

37853786
switch ( QgsWkbTypes::flatType( geometryType ) )
37863787
{
37873788
case QgsWkbTypes::CircularString:
37883789
case QgsWkbTypes::CompoundCurve:
3789-
tempGeom = geom->segmentize();
3790+
tempGeom.reset( geom.constGet()->segmentize() );
3791+
sourceGeom = tempGeom.get();
37903792
if ( !tempGeom )
37913793
break;
37923794
FALLTHROUGH
37933795
case QgsWkbTypes::LineString:
37943796
if ( !qgsDoubleNear( offset, 0.0 ) )
37953797
{
3796-
QgsGeos geos( tempGeom );
3797-
if ( tempGeom != geom.get() )
3798-
delete tempGeom;
3799-
tempGeom = geos.offsetCurve( offset, 0, GEOSBUF_JOIN_MITRE, 2.0 ); //#spellok
3800-
if ( !tempGeom )
3801-
tempGeom = geom.get();
3798+
QgsGeos geos( sourceGeom );
3799+
tempGeom.reset( geos.offsetCurve( offset, 0, GEOSBUF_JOIN_MITRE, 2.0 ) ); //#spellok
3800+
if ( tempGeom )
3801+
sourceGeom = tempGeom.get();
3802+
else
3803+
sourceGeom = geom.constGet();
38023804
}
38033805

3804-
writePolyline( tempGeom->coordinateSequence().at( 0 ).at( 0 ), layer, lineStyleName, penColor, width );
3806+
writePolyline( sourceGeom->coordinateSequence().at( 0 ).at( 0 ), layer, lineStyleName, penColor, width );
38053807

38063808
break;
38073809

38083810
case QgsWkbTypes::MultiCurve:
3809-
tempGeom = geom->segmentize();
3811+
tempGeom.reset( geom.constGet()->segmentize() );
38103812
if ( !tempGeom )
38113813
break;
3814+
sourceGeom = tempGeom.get();
38123815
FALLTHROUGH
38133816
case QgsWkbTypes::MultiLineString:
38143817
{
38153818
if ( !qgsDoubleNear( offset, 0.0 ) )
38163819
{
3817-
QgsGeos geos( tempGeom );
3818-
if ( tempGeom != geom.get() )
3819-
delete tempGeom;
3820-
tempGeom = geos.offsetCurve( offset, 0, GEOSBUF_JOIN_MITRE, 2.0 ); //#spellok
3821-
if ( !tempGeom )
3822-
tempGeom = geom.get();
3820+
QgsGeos geos( sourceGeom );
3821+
tempGeom.reset( geos.offsetCurve( offset, 0, GEOSBUF_JOIN_MITRE, 2.0 ) ); //#spellok
3822+
if ( tempGeom )
3823+
sourceGeom = tempGeom.get();
3824+
else
3825+
sourceGeom = geom.constGet();
38233826
}
38243827

3825-
const QgsCoordinateSequence &cs = tempGeom->coordinateSequence();
3828+
const QgsCoordinateSequence &cs = sourceGeom->coordinateSequence();
38263829
for ( int i = 0; i < cs.size(); i++ )
38273830
{
38283831
writePolyline( cs.at( i ).at( 0 ), layer, lineStyleName, penColor, width );
@@ -3832,23 +3835,24 @@ void QgsDxfExport::addFeature( QgsSymbolRenderContext &ctx, const QgsCoordinateT
38323835
}
38333836

38343837
case QgsWkbTypes::CurvePolygon:
3835-
tempGeom = geom->segmentize();
3838+
tempGeom.reset( geom.constGet()->segmentize() );
38363839
if ( !tempGeom )
38373840
break;
3841+
sourceGeom = tempGeom.get();
38383842
FALLTHROUGH
38393843
case QgsWkbTypes::Polygon:
38403844
{
38413845
if ( !qgsDoubleNear( offset, 0.0 ) )
38423846
{
3843-
QgsGeos geos( tempGeom );
3844-
if ( tempGeom != geom.get() )
3845-
delete tempGeom;
3846-
tempGeom = geos.buffer( offset, 0, GEOSBUF_CAP_FLAT, GEOSBUF_JOIN_MITRE, 2.0 ); //#spellok
3847-
if ( !tempGeom )
3848-
tempGeom = geom.get();
3847+
QgsGeos geos( sourceGeom );
3848+
tempGeom.reset( geos.buffer( offset, 0, GEOSBUF_CAP_FLAT, GEOSBUF_JOIN_MITRE, 2.0 ) ); //#spellok
3849+
if ( tempGeom )
3850+
sourceGeom = tempGeom.get();
3851+
else
3852+
sourceGeom = geom.constGet();
38493853
}
38503854

3851-
const QgsCoordinateSequence &cs = tempGeom->coordinateSequence();
3855+
const QgsCoordinateSequence &cs = sourceGeom->coordinateSequence();
38523856
for ( int i = 0; i < cs.at( 0 ).size(); i++ )
38533857
{
38543858
writePolyline( cs.at( 0 ).at( i ), layer, lineStyleName, penColor, width );
@@ -3858,23 +3862,24 @@ void QgsDxfExport::addFeature( QgsSymbolRenderContext &ctx, const QgsCoordinateT
38583862
}
38593863

38603864
case QgsWkbTypes::MultiSurface:
3861-
tempGeom = geom->segmentize();
3865+
tempGeom.reset( geom.constGet()->segmentize() );
38623866
if ( !tempGeom )
38633867
break;
3868+
sourceGeom = tempGeom.get();
38643869
FALLTHROUGH
38653870
case QgsWkbTypes::MultiPolygon:
38663871
{
38673872
if ( !qgsDoubleNear( offset, 0.0 ) )
38683873
{
3869-
QgsGeos geos( tempGeom );
3870-
if ( tempGeom != geom.get() )
3871-
delete tempGeom;
3872-
tempGeom = geos.buffer( offset, 0, GEOSBUF_CAP_FLAT, GEOSBUF_JOIN_MITRE, 2.0 ); //#spellok
3873-
if ( !tempGeom )
3874-
tempGeom = geom.get();
3874+
QgsGeos geos( sourceGeom );
3875+
tempGeom.reset( geos.buffer( offset, 0, GEOSBUF_CAP_FLAT, GEOSBUF_JOIN_MITRE, 2.0 ) ); //#spellok
3876+
if ( tempGeom )
3877+
sourceGeom = tempGeom.get();
3878+
else
3879+
sourceGeom = geom.constGet();
38753880
}
38763881

3877-
const QgsCoordinateSequence &cs = tempGeom->coordinateSequence();
3882+
const QgsCoordinateSequence &cs = sourceGeom->coordinateSequence();
38783883
for ( int i = 0; i < cs.size(); i++ )
38793884
for ( int j = 0; j < cs.at( i ).size(); j++ )
38803885
writePolyline( cs.at( i ).at( j ), layer, lineStyleName, penColor, width );
@@ -3886,33 +3891,34 @@ void QgsDxfExport::addFeature( QgsSymbolRenderContext &ctx, const QgsCoordinateT
38863891
break;
38873892
}
38883893

3889-
if ( tempGeom != geom.get() )
3890-
delete tempGeom;
38913894
}
38923895

38933896
if ( brushStyle != Qt::NoBrush )
38943897
{
3895-
const QgsAbstractGeometry *tempGeom = geom.get();
3898+
const QgsAbstractGeometry *sourceGeom = geom.constGet();
3899+
std::unique_ptr< QgsAbstractGeometry > tempGeom;
38963900

38973901
switch ( QgsWkbTypes::flatType( geometryType ) )
38983902
{
38993903
case QgsWkbTypes::CurvePolygon:
3900-
tempGeom = tempGeom->segmentize();
3904+
tempGeom.reset( geom.constGet()->segmentize() );
39013905
if ( !tempGeom )
39023906
break;
3907+
sourceGeom = tempGeom.get();
39033908
FALLTHROUGH
39043909
case QgsWkbTypes::Polygon:
3905-
writePolygon( tempGeom->coordinateSequence().at( 0 ), layer, QStringLiteral( "SOLID" ), brushColor );
3910+
writePolygon( sourceGeom->coordinateSequence().at( 0 ), layer, QStringLiteral( "SOLID" ), brushColor );
39063911
break;
39073912

39083913
case QgsWkbTypes::MultiSurface:
3909-
tempGeom = tempGeom->segmentize();
3914+
tempGeom.reset( geom.constGet()->segmentize() );
39103915
if ( !tempGeom )
39113916
break;
3917+
sourceGeom = tempGeom.get();
39123918
FALLTHROUGH
39133919
case QgsWkbTypes::MultiPolygon:
39143920
{
3915-
const QgsCoordinateSequence &cs = tempGeom->coordinateSequence();
3921+
const QgsCoordinateSequence &cs = sourceGeom->coordinateSequence();
39163922
for ( int i = 0; i < cs.size(); i++ )
39173923
{
39183924
writePolygon( cs.at( i ), layer, QStringLiteral( "SOLID" ), brushColor );
@@ -3924,9 +3930,6 @@ void QgsDxfExport::addFeature( QgsSymbolRenderContext &ctx, const QgsCoordinateT
39243930
break;
39253931

39263932
}
3927-
3928-
if ( tempGeom != geom.get() )
3929-
delete tempGeom;
39303933
}
39313934
}
39323935

0 commit comments

Comments
 (0)
Please sign in to comment.