diff --git a/src/plugins/analyzerbase/analyzermanager.cpp b/src/plugins/analyzerbase/analyzermanager.cpp index 539e6bd09e1..a5617a73c5a 100644 --- a/src/plugins/analyzerbase/analyzermanager.cpp +++ b/src/plugins/analyzerbase/analyzermanager.cpp @@ -140,11 +140,16 @@ public: Utils::StyledSeparator *m_toolBoxSeparator; ActionContainer *m_viewsMenu; typedef QPair ToolWidgetPair; - QMap > m_toolWidgets; + typedef QList ToolWidgetPairList; + QMap m_toolWidgets; DockWidgetEventFilter *m_resizeEventFilter; QMap m_toolToolbarWidgets; QStackedWidget *m_toolbarStackedWidget; QMap m_defaultSettings; + + // list of dock widgets to prevent memory leak + typedef QWeakPointer DockPtr; + QList m_dockWidgets; }; AnalyzerManager::AnalyzerManagerPrivate::AnalyzerManagerPrivate(AnalyzerManager *qq): @@ -177,6 +182,12 @@ AnalyzerManager::AnalyzerManagerPrivate::AnalyzerManagerPrivate(AnalyzerManager AnalyzerManager::AnalyzerManagerPrivate::~AnalyzerManagerPrivate() { + // as we have to setParent(0) on dock widget that are not selected, + // we keep track of all and make sure we don't leak any + foreach(const DockPtr &ptr, m_dockWidgets) { + if (ptr) + delete ptr.data(); + } } void AnalyzerManager::AnalyzerManagerPrivate::setupActions() @@ -561,6 +572,7 @@ QDockWidget *AnalyzerManager::createDockWidget(IAnalyzerTool *tool, const QStrin QTC_ASSERT(!widget->objectName().isEmpty(), qt_noop()); QDockWidget *dockWidget = d->m_mainWindow->addDockForWidget(widget); + d->m_dockWidgets << AnalyzerManagerPrivate::DockPtr(dockWidget); dockWidget->setWindowTitle(title); d->m_toolWidgets[tool] << qMakePair(area, dockWidget); diff --git a/src/plugins/analyzerbase/analyzerplugin.cpp b/src/plugins/analyzerbase/analyzerplugin.cpp index e62e2e4f422..d943aa6c14f 100644 --- a/src/plugins/analyzerbase/analyzerplugin.cpp +++ b/src/plugins/analyzerbase/analyzerplugin.cpp @@ -76,7 +76,7 @@ void AnalyzerPlugin::AnalyzerPluginPrivate::initialize(const QStringList &argume { Q_UNUSED(arguments) Q_UNUSED(errorString) - m_manager = new AnalyzerManager; + m_manager = new AnalyzerManager(q); } @@ -92,6 +92,7 @@ AnalyzerPlugin::~AnalyzerPlugin() // Unregister objects from the plugin manager's object pool // Delete members delete d; + m_instance = 0; } bool AnalyzerPlugin::initialize(const QStringList &arguments, QString *errorString) diff --git a/src/plugins/analyzerbase/analyzersettings.cpp b/src/plugins/analyzerbase/analyzersettings.cpp index 6ca463753ef..aec7128e5a6 100644 --- a/src/plugins/analyzerbase/analyzersettings.cpp +++ b/src/plugins/analyzerbase/analyzersettings.cpp @@ -53,7 +53,8 @@ static const QLatin1String groupC("Analyzer"); AnalyzerGlobalSettings *AnalyzerGlobalSettings::m_instance = 0; -AbstractAnalyzerSubConfig::AbstractAnalyzerSubConfig() +AbstractAnalyzerSubConfig::AbstractAnalyzerSubConfig(QObject *parent) +: QObject(parent) { } @@ -62,7 +63,8 @@ AbstractAnalyzerSubConfig::~AbstractAnalyzerSubConfig() { } -AnalyzerSettings::AnalyzerSettings() +AnalyzerSettings::AnalyzerSettings(QObject *parent) +: QObject(parent) { } @@ -97,7 +99,8 @@ QVariantMap AnalyzerSettings::toMap() const return map; } -AnalyzerGlobalSettings::AnalyzerGlobalSettings() +AnalyzerGlobalSettings::AnalyzerGlobalSettings(QObject *parent) +: AnalyzerSettings(parent) { QTC_ASSERT(!m_instance, return); m_instance = this; @@ -106,7 +109,8 @@ AnalyzerGlobalSettings::AnalyzerGlobalSettings() AnalyzerGlobalSettings *AnalyzerGlobalSettings::instance() { if (!m_instance) - m_instance = new AnalyzerGlobalSettings; + m_instance = new AnalyzerGlobalSettings(AnalyzerPlugin::instance()); + return m_instance; } @@ -147,7 +151,7 @@ void AnalyzerGlobalSettings::registerSubConfigFactory(AbstractAnalyzerSubConfigF { m_subConfigFactories << factory; - AbstractAnalyzerSubConfig *config = factory->createGlobalSubConfig(); + AbstractAnalyzerSubConfig *config = factory->createGlobalSubConfig(this); addSubConfig(config); AnalyzerPlugin::instance()->addAutoReleasedObject(new AnalyzerOptionsPage(config)); @@ -159,11 +163,12 @@ QList AnalyzerGlobalSettings::subConfigFacto return m_subConfigFactories; } -AnalyzerProjectSettings::AnalyzerProjectSettings() +AnalyzerProjectSettings::AnalyzerProjectSettings(QObject *parent) +: AnalyzerSettings(parent) { // add sub configs foreach(AbstractAnalyzerSubConfigFactory *factory, AnalyzerGlobalSettings::instance()->subConfigFactories()) { - addSubConfig(factory->createProjectSubConfig()); + addSubConfig(factory->createProjectSubConfig(parent)); } // take defaults from global settings @@ -171,6 +176,10 @@ AnalyzerProjectSettings::AnalyzerProjectSettings() fromMap(gs->toMap()); } +AnalyzerProjectSettings::~AnalyzerProjectSettings() +{ +} + QString AnalyzerProjectSettings::displayName() const { return tr("Analyzer Settings"); diff --git a/src/plugins/analyzerbase/analyzersettings.h b/src/plugins/analyzerbase/analyzersettings.h index a0500ccadbb..12e0d20d93a 100644 --- a/src/plugins/analyzerbase/analyzersettings.h +++ b/src/plugins/analyzerbase/analyzersettings.h @@ -64,7 +64,7 @@ class ANALYZER_EXPORT AbstractAnalyzerSubConfig : public QObject { Q_OBJECT public: - AbstractAnalyzerSubConfig(); + AbstractAnalyzerSubConfig(QObject *parent); virtual ~AbstractAnalyzerSubConfig(); virtual QVariantMap defaults() const = 0; @@ -86,8 +86,8 @@ public: AbstractAnalyzerSubConfigFactory(){} ~AbstractAnalyzerSubConfigFactory(){} - virtual AbstractAnalyzerSubConfig *createGlobalSubConfig() = 0; - virtual AbstractAnalyzerSubConfig *createProjectSubConfig() = 0; + virtual AbstractAnalyzerSubConfig *createGlobalSubConfig(QObject *parent) = 0; + virtual AbstractAnalyzerSubConfig *createProjectSubConfig(QObject *parent) = 0; }; /** @@ -103,14 +103,14 @@ class ANALYZER_EXPORT AnalyzerSubConfigFactory : public AbstractAnalyzerSubConfi public: AnalyzerSubConfigFactory(){} - AbstractAnalyzerSubConfig *createGlobalSubConfig() + AbstractAnalyzerSubConfig *createGlobalSubConfig(QObject *parent) { - return new GlobalConfigT; + return new GlobalConfigT(parent); } - AbstractAnalyzerSubConfig *createProjectSubConfig() + AbstractAnalyzerSubConfig *createProjectSubConfig(QObject *parent) { - return new ProjectConfigT; + return new ProjectConfigT(parent); } }; @@ -147,7 +147,7 @@ protected: virtual bool fromMap(const QVariantMap &map); - AnalyzerSettings(); + AnalyzerSettings(QObject *parent); }; @@ -170,7 +170,7 @@ public: QList subConfigFactories() const; private: - AnalyzerGlobalSettings(); + AnalyzerGlobalSettings(QObject *parent); static AnalyzerGlobalSettings *m_instance; QList m_subConfigFactories; }; @@ -182,7 +182,8 @@ class ANALYZER_EXPORT AnalyzerProjectSettings : public AnalyzerSettings, public { Q_OBJECT public: - AnalyzerProjectSettings(); + AnalyzerProjectSettings(QObject *parent = 0); + virtual ~AnalyzerProjectSettings(); QString displayName() const; diff --git a/src/plugins/memcheck/memchecksettings.cpp b/src/plugins/memcheck/memchecksettings.cpp index e669f2718f0..9eba99e775d 100644 --- a/src/plugins/memcheck/memchecksettings.cpp +++ b/src/plugins/memcheck/memchecksettings.cpp @@ -51,7 +51,8 @@ static const QLatin1String addedSuppressionFilesC("Analyzer.Valgrind.AddedSupres static const QLatin1String filterExternalIssuesC("Analyzer.Valgrind.FilterExternalIssues"); static const QLatin1String visibleErrorKindsC("Analyzer.Valgrind.VisibleErrorKinds"); -AbstractMemcheckSettings::AbstractMemcheckSettings() +AbstractMemcheckSettings::AbstractMemcheckSettings(QObject *parent) +: AbstractAnalyzerSubConfig(parent) { } @@ -154,7 +155,8 @@ QWidget* AbstractMemcheckSettings::createConfigWidget(QWidget *parent) return new MemcheckConfigWidget(this, parent); } -MemcheckGlobalSettings::MemcheckGlobalSettings() +MemcheckGlobalSettings::MemcheckGlobalSettings(QObject *parent) +: AbstractMemcheckSettings(parent) { } @@ -201,7 +203,12 @@ MemcheckGlobalSettings *globalMemcheckSettings() return ret; } -MemcheckProjectSettings::MemcheckProjectSettings() +MemcheckProjectSettings::MemcheckProjectSettings(QObject *parent) +: AbstractMemcheckSettings(parent) +{ +} + +MemcheckProjectSettings::~MemcheckProjectSettings() { } diff --git a/src/plugins/memcheck/memchecksettings.h b/src/plugins/memcheck/memchecksettings.h index 171d5f54369..27cc8e07654 100644 --- a/src/plugins/memcheck/memchecksettings.h +++ b/src/plugins/memcheck/memchecksettings.h @@ -48,7 +48,7 @@ class AbstractMemcheckSettings : public AbstractAnalyzerSubConfig { Q_OBJECT public: - AbstractMemcheckSettings(); + AbstractMemcheckSettings(QObject *parent); virtual ~AbstractMemcheckSettings(); virtual bool fromMap(const QVariantMap &map); @@ -98,7 +98,7 @@ class MemcheckGlobalSettings : public AbstractMemcheckSettings { Q_OBJECT public: - MemcheckGlobalSettings(); + MemcheckGlobalSettings(QObject *parent); virtual ~MemcheckGlobalSettings(); QStringList suppressionFiles() const; @@ -122,7 +122,8 @@ class MemcheckProjectSettings : public AbstractMemcheckSettings { Q_OBJECT public: - MemcheckProjectSettings(); + MemcheckProjectSettings(QObject *parent); + virtual ~MemcheckProjectSettings(); QStringList suppressionFiles() const; // in the project-specific settings we store a diff to the global list diff --git a/src/plugins/valgrindtoolbase/valgrindsettings.cpp b/src/plugins/valgrindtoolbase/valgrindsettings.cpp index 9251c11b026..93f50889758 100644 --- a/src/plugins/valgrindtoolbase/valgrindsettings.cpp +++ b/src/plugins/valgrindtoolbase/valgrindsettings.cpp @@ -49,7 +49,8 @@ static const QLatin1String groupC("Analyzer"); static const QLatin1String valgrindExeC("Analyzer.Valgrind.ValgrindExecutable"); -ValgrindSettings::ValgrindSettings() +ValgrindSettings::ValgrindSettings(QObject *parent) +: AbstractAnalyzerSubConfig(parent) { } diff --git a/src/plugins/valgrindtoolbase/valgrindsettings.h b/src/plugins/valgrindtoolbase/valgrindsettings.h index fb535633c40..f857605f41d 100644 --- a/src/plugins/valgrindtoolbase/valgrindsettings.h +++ b/src/plugins/valgrindtoolbase/valgrindsettings.h @@ -53,7 +53,7 @@ class VALGRINDTOOLBASE_EXPORT ValgrindSettings : public AbstractAnalyzerSubConfi { Q_OBJECT public: - ValgrindSettings(); + ValgrindSettings(QObject *parent); virtual ~ValgrindSettings(); virtual QVariantMap toMap() const;