From dbf70c603a7a463d74f5fd200bd404b7251beeb8 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Sun, 19 Oct 2014 08:26:06 +1100 Subject: [PATCH] [composer] Fix a memory leak when destroying compositions --- src/core/composer/qgscomposition.cpp | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/core/composer/qgscomposition.cpp b/src/core/composer/qgscomposition.cpp index 8e231c17897e..d22fe7d8208e 100644 --- a/src/core/composer/qgscomposition.cpp +++ b/src/core/composer/qgscomposition.cpp @@ -187,16 +187,16 @@ QgsComposition::~QgsComposition() removePaperItems(); deleteAndRemoveMultiFrames(); - // clear pointers to QgsDataDefined objects - //TODO - should be qDeleteAll? Check original label code too for same leak. - mDataDefinedProperties.clear(); - // make sure that all composer items are removed before // this class is deconstructed - to avoid segfaults // when composer items access in destructor composition that isn't valid anymore QList itemList = items(); qDeleteAll( itemList ); + // clear pointers to QgsDataDefined objects + qDeleteAll( mDataDefinedProperties ); + mDataDefinedProperties.clear(); + //order is important here - we need to delete model last so that all items have already //been deleted. Deleting the undo stack will also delete any items which have been //removed from the scene, so this needs to be done before deleting the model @@ -925,13 +925,14 @@ bool QgsComposition::loadFromTemplate( const QDomDocument& doc, QMap itemList = items(); QList::iterator itemIter = itemList.begin(); for ( ; itemIter != itemList.end(); ++itemIter ) { QgsComposerItem* cItem = dynamic_cast( *itemIter ); - if ( cItem ) + QgsPaperItem* pItem = dynamic_cast( *itemIter ); + if ( cItem && !pItem ) { removeItem( cItem ); emit itemRemoved( cItem ); @@ -940,7 +941,7 @@ bool QgsComposition::loadFromTemplate( const QDomDocument& doc, QMapclear(); - mPages.clear(); + removePaperItems(); mUndoStack->clear(); } @@ -2550,10 +2551,7 @@ void QgsComposition::addPaperItem() void QgsComposition::removePaperItems() { - for ( int i = 0; i < mPages.size(); ++i ) - { - delete mPages.at( i ); - } + qDeleteAll( mPages ); mPages.clear(); QgsExpression::setSpecialColumn( "$numpages", QVariant(( int )0 ) ); }