Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 2c9c665

Browse files
committedMay 23, 2019
Fix confusing memory management in dxf export
1 parent d2a0eb2 commit 2c9c665

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
@@ -3721,13 +3721,13 @@ void QgsDxfExport::addFeature( QgsSymbolRenderContext &ctx, const QgsCoordinateT
37213721
if ( !fet->hasGeometry() )
37223722
return;
37233723

3724-
std::unique_ptr<QgsAbstractGeometry> geom( fet->geometry().constGet()->clone() );
3724+
QgsGeometry geom( fet->geometry() );
37253725
if ( ct.isValid() )
37263726
{
3727-
geom->transform( ct );
3727+
geom.transform( ct );
37283728
}
37293729

3730-
QgsWkbTypes::Type geometryType = geom->wkbType();
3730+
QgsWkbTypes::Type geometryType = geom.wkbType();
37313731

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

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

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

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

3803-
writePolyline( tempGeom->coordinateSequence().at( 0 ).at( 0 ), layer, lineStyleName, penColor, width );
3805+
writePolyline( sourceGeom->coordinateSequence().at( 0 ).at( 0 ), layer, lineStyleName, penColor, width );
38043806

38053807
break;
38063808

38073809
case QgsWkbTypes::MultiCurve:
3808-
tempGeom = geom->segmentize();
3810+
tempGeom.reset( geom.constGet()->segmentize() );
38093811
if ( !tempGeom )
38103812
break;
3813+
sourceGeom = tempGeom.get();
38113814
FALLTHROUGH
38123815
case QgsWkbTypes::MultiLineString:
38133816
{
38143817
if ( !qgsDoubleNear( offset, 0.0 ) )
38153818
{
3816-
QgsGeos geos( tempGeom );
3817-
if ( tempGeom != geom.get() )
3818-
delete tempGeom;
3819-
tempGeom = geos.offsetCurve( offset, 0, GEOSBUF_JOIN_MITRE, 2.0 ); //#spellok
3820-
if ( !tempGeom )
3821-
tempGeom = geom.get();
3819+
QgsGeos geos( sourceGeom );
3820+
tempGeom.reset( geos.offsetCurve( offset, 0, GEOSBUF_JOIN_MITRE, 2.0 ) ); //#spellok
3821+
if ( tempGeom )
3822+
sourceGeom = tempGeom.get();
3823+
else
3824+
sourceGeom = geom.constGet();
38223825
}
38233826

3824-
const QgsCoordinateSequence &cs = tempGeom->coordinateSequence();
3827+
const QgsCoordinateSequence &cs = sourceGeom->coordinateSequence();
38253828
for ( int i = 0; i < cs.size(); i++ )
38263829
{
38273830
writePolyline( cs.at( i ).at( 0 ), layer, lineStyleName, penColor, width );
@@ -3831,23 +3834,24 @@ void QgsDxfExport::addFeature( QgsSymbolRenderContext &ctx, const QgsCoordinateT
38313834
}
38323835

38333836
case QgsWkbTypes::CurvePolygon:
3834-
tempGeom = geom->segmentize();
3837+
tempGeom.reset( geom.constGet()->segmentize() );
38353838
if ( !tempGeom )
38363839
break;
3840+
sourceGeom = tempGeom.get();
38373841
FALLTHROUGH
38383842
case QgsWkbTypes::Polygon:
38393843
{
38403844
if ( !qgsDoubleNear( offset, 0.0 ) )
38413845
{
3842-
QgsGeos geos( tempGeom );
3843-
if ( tempGeom != geom.get() )
3844-
delete tempGeom;
3845-
tempGeom = geos.buffer( offset, 0, GEOSBUF_CAP_FLAT, GEOSBUF_JOIN_MITRE, 2.0 ); //#spellok
3846-
if ( !tempGeom )
3847-
tempGeom = geom.get();
3846+
QgsGeos geos( sourceGeom );
3847+
tempGeom.reset( geos.buffer( offset, 0, GEOSBUF_CAP_FLAT, GEOSBUF_JOIN_MITRE, 2.0 ) ); //#spellok
3848+
if ( tempGeom )
3849+
sourceGeom = tempGeom.get();
3850+
else
3851+
sourceGeom = geom.constGet();
38483852
}
38493853

3850-
const QgsCoordinateSequence &cs = tempGeom->coordinateSequence();
3854+
const QgsCoordinateSequence &cs = sourceGeom->coordinateSequence();
38513855
for ( int i = 0; i < cs.at( 0 ).size(); i++ )
38523856
{
38533857
writePolyline( cs.at( 0 ).at( i ), layer, lineStyleName, penColor, width );
@@ -3857,23 +3861,24 @@ void QgsDxfExport::addFeature( QgsSymbolRenderContext &ctx, const QgsCoordinateT
38573861
}
38583862

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

3876-
const QgsCoordinateSequence &cs = tempGeom->coordinateSequence();
3881+
const QgsCoordinateSequence &cs = sourceGeom->coordinateSequence();
38773882
for ( int i = 0; i < cs.size(); i++ )
38783883
for ( int j = 0; j < cs.at( i ).size(); j++ )
38793884
writePolyline( cs.at( i ).at( j ), layer, lineStyleName, penColor, width );
@@ -3885,33 +3890,34 @@ void QgsDxfExport::addFeature( QgsSymbolRenderContext &ctx, const QgsCoordinateT
38853890
break;
38863891
}
38873892

3888-
if ( tempGeom != geom.get() )
3889-
delete tempGeom;
38903893
}
38913894

38923895
if ( brushStyle != Qt::NoBrush )
38933896
{
3894-
const QgsAbstractGeometry *tempGeom = geom.get();
3897+
const QgsAbstractGeometry *sourceGeom = geom.constGet();
3898+
std::unique_ptr< QgsAbstractGeometry > tempGeom;
38953899

38963900
switch ( QgsWkbTypes::flatType( geometryType ) )
38973901
{
38983902
case QgsWkbTypes::CurvePolygon:
3899-
tempGeom = tempGeom->segmentize();
3903+
tempGeom.reset( geom.constGet()->segmentize() );
39003904
if ( !tempGeom )
39013905
break;
3906+
sourceGeom = tempGeom.get();
39023907
FALLTHROUGH
39033908
case QgsWkbTypes::Polygon:
3904-
writePolygon( tempGeom->coordinateSequence().at( 0 ), layer, QStringLiteral( "SOLID" ), brushColor );
3909+
writePolygon( sourceGeom->coordinateSequence().at( 0 ), layer, QStringLiteral( "SOLID" ), brushColor );
39053910
break;
39063911

39073912
case QgsWkbTypes::MultiSurface:
3908-
tempGeom = tempGeom->segmentize();
3913+
tempGeom.reset( geom.constGet()->segmentize() );
39093914
if ( !tempGeom )
39103915
break;
3916+
sourceGeom = tempGeom.get();
39113917
FALLTHROUGH
39123918
case QgsWkbTypes::MultiPolygon:
39133919
{
3914-
const QgsCoordinateSequence &cs = tempGeom->coordinateSequence();
3920+
const QgsCoordinateSequence &cs = sourceGeom->coordinateSequence();
39153921
for ( int i = 0; i < cs.size(); i++ )
39163922
{
39173923
writePolygon( cs.at( i ), layer, QStringLiteral( "SOLID" ), brushColor );
@@ -3923,9 +3929,6 @@ void QgsDxfExport::addFeature( QgsSymbolRenderContext &ctx, const QgsCoordinateT
39233929
break;
39243930

39253931
}
3926-
3927-
if ( tempGeom != geom.get() )
3928-
delete tempGeom;
39293932
}
39303933
}
39313934

0 commit comments

Comments
 (0)
Please sign in to comment.