Skip to content

Commit 48e5c09

Browse files
committedFeb 5, 2017
Fix a lot of memory leaks when fetching provider libraries
1 parent 4f7d9cd commit 48e5c09

8 files changed

+17
-21
lines changed
 

‎src/core/qgsdataitem.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1175,7 +1175,7 @@ void QgsZipItem::init()
11751175
QgsDebugMsgLevel( "provider " + k, 3 );
11761176
// some providers hangs with empty uri (Postgis) etc...
11771177
// -> using libraries directly
1178-
QLibrary *library = QgsProviderRegistry::instance()->providerLibrary( k );
1178+
QScopedPointer< QLibrary > library( QgsProviderRegistry::instance()->providerLibrary( k ) );
11791179
if ( library )
11801180
{
11811181
dataCapabilities_t * dataCapabilities = reinterpret_cast< dataCapabilities_t * >( cast_to_fptr( library->resolve( "dataCapabilities" ) ) );

‎src/core/qgsdataitemproviderregistry.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ QgsDataItemProviderRegistry::QgsDataItemProviderRegistry()
6262

6363
Q_FOREACH ( const QString& key, providersList )
6464
{
65-
QLibrary *library = QgsProviderRegistry::instance()->providerLibrary( key );
65+
QScopedPointer< QLibrary > library( QgsProviderRegistry::instance()->providerLibrary( key ) );
6666
if ( !library )
6767
continue;
6868

‎src/core/qgsproviderregistry.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -402,7 +402,7 @@ QgsDataProvider *QgsProviderRegistry::provider( QString const & providerKey, QSt
402402

403403
int QgsProviderRegistry::providerCapabilities( const QString &providerKey ) const
404404
{
405-
QLibrary *library = providerLibrary( providerKey );
405+
QScopedPointer< QLibrary > library( providerLibrary( providerKey ) );
406406
if ( !library )
407407
{
408408
return QgsDataProvider::NoDataCapabilities;
@@ -450,19 +450,17 @@ QFunctionPointer QgsProviderRegistry::function( QString const & providerKey,
450450
}
451451
}
452452

453-
QLibrary *QgsProviderRegistry::providerLibrary( QString const & providerKey ) const
453+
QLibrary* QgsProviderRegistry::providerLibrary( QString const & providerKey ) const
454454
{
455-
QLibrary *myLib = new QLibrary( library( providerKey ) );
455+
QScopedPointer< QLibrary > myLib( new QLibrary( library( providerKey ) ) );
456456

457457
QgsDebugMsg( "Library name is " + myLib->fileName() );
458458

459459
if ( myLib->load() )
460-
return myLib;
460+
return myLib.take();
461461

462462
QgsDebugMsg( "Cannot load library: " + myLib->errorString() );
463463

464-
delete myLib;
465-
466464
return nullptr;
467465
}
468466

‎src/core/qgsproviderregistry.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,11 @@ class CORE_EXPORT QgsProviderRegistry
9494
QFunctionPointer function( const QString & providerKey,
9595
const QString & functionName );
9696

97-
QLibrary *providerLibrary( const QString & providerKey ) const;
97+
/**
98+
* Returns a new QLibrary for the specified \a providerKey. Ownership of the returned
99+
* object is transferred to the caller and the caller is responsible for deleting it.
100+
*/
101+
QLibrary* providerLibrary( const QString & providerKey ) const;
98102

99103
//! Return list of available providers by their keys
100104
QStringList providerList() const;

‎src/core/qgstransaction.cpp

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,7 @@ typedef QgsTransaction* createTransaction_t( const QString& connString );
2929

3030
QgsTransaction* QgsTransaction::create( const QString& connString, const QString& providerKey )
3131
{
32-
33-
QLibrary* lib = QgsProviderRegistry::instance()->providerLibrary( providerKey );
32+
QScopedPointer< QLibrary > lib( QgsProviderRegistry::instance()->providerLibrary( providerKey ) );
3433
if ( !lib )
3534
return nullptr;
3635

@@ -40,8 +39,6 @@ QgsTransaction* QgsTransaction::create( const QString& connString, const QString
4039

4140
QgsTransaction* ts = createTransaction( connString );
4241

43-
delete lib;
44-
4542
return ts;
4643
}
4744

@@ -167,7 +164,7 @@ bool QgsTransaction::rollback( QString& errorMsg )
167164

168165
bool QgsTransaction::supportsTransaction( const QgsVectorLayer* layer )
169166
{
170-
QLibrary* lib = QgsProviderRegistry::instance()->providerLibrary( layer->providerType() );
167+
QScopedPointer< QLibrary > lib( QgsProviderRegistry::instance()->providerLibrary( layer->providerType() ) );
171168
if ( !lib )
172169
return false;
173170

‎src/core/qgsvectorlayerimport.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ QgsVectorLayerImport::QgsVectorLayerImport( const QString &uri,
6363

6464
QgsProviderRegistry * pReg = QgsProviderRegistry::instance();
6565

66-
QLibrary *myLib = pReg->providerLibrary( providerKey );
66+
QScopedPointer< QLibrary > myLib( pReg->providerLibrary( providerKey ) );
6767
if ( !myLib )
6868
{
6969
mError = ErrInvalidProvider;
@@ -74,14 +74,11 @@ QgsVectorLayerImport::QgsVectorLayerImport( const QString &uri,
7474
createEmptyLayer_t * pCreateEmpty = reinterpret_cast< createEmptyLayer_t * >( cast_to_fptr( myLib->resolve( "createEmptyLayer" ) ) );
7575
if ( !pCreateEmpty )
7676
{
77-
delete myLib;
7877
mError = ErrProviderUnsupportedFeature;
7978
mErrorMessage = QObject::tr( "Provider %1 has no %2 method" ).arg( providerKey, QStringLiteral( "createEmptyLayer" ) );
8079
return;
8180
}
8281

83-
delete myLib;
84-
8582
// create an empty layer
8683
QString errMsg;
8784
mError = pCreateEmpty( uri, fields, geometryType, crs, overwrite, &mOldToNewAttrIdx, &errMsg, options );

‎src/gui/qgsrasterformatsaveoptionswidget.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ void QgsRasterFormatSaveOptionsWidget::helpOptions()
261261
if ( mProvider == QLatin1String( "gdal" ) && mFormat != QLatin1String( "" ) && ! mPyramids )
262262
{
263263
// get helpCreationOptionsFormat() function ptr for provider
264-
QLibrary *library = QgsProviderRegistry::instance()->providerLibrary( mProvider );
264+
QScopedPointer< QLibrary > library( QgsProviderRegistry::instance()->providerLibrary( mProvider ) );
265265
if ( library )
266266
{
267267
helpCreationOptionsFormat_t * helpCreationOptionsFormat =
@@ -357,7 +357,7 @@ QString QgsRasterFormatSaveOptionsWidget::validateOptions( bool gui, bool report
357357
else
358358
{
359359
// get validateCreationOptionsFormat() function ptr for provider
360-
QLibrary *library = QgsProviderRegistry::instance()->providerLibrary( mProvider );
360+
QScopedPointer< QLibrary > library( QgsProviderRegistry::instance()->providerLibrary( mProvider ) );
361361
if ( library )
362362
{
363363
validateCreationOptionsFormat_t * validateCreationOptionsFormat =

‎src/providers/ows/qgsowsdataitems.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ QVector<QgsDataItem*> QgsOWSConnectionItem::createChildren()
4545
Q_FOREACH ( const QString& key, QStringList() << "wms" << "WFS" << "wcs" )
4646
{
4747
QgsDebugMsg( "Add connection for provider " + key );
48-
QLibrary *library = QgsProviderRegistry::instance()->providerLibrary( key );
48+
QScopedPointer< QLibrary > library( QgsProviderRegistry::instance()->providerLibrary( key ) );
4949
if ( !library )
5050
{
5151
QgsDebugMsg( "Cannot get provider " + key );

0 commit comments

Comments
 (0)
Please sign in to comment.