fix leaks of singletons

Merge-request: 265
Reviewed-by: hjk <qtc-committer@nokia.com>
This commit is contained in:
Milian Wolff
2011-03-04 16:00:01 +01:00
committed by hjk
parent 8f5e33cfc0
commit 1e3d1982ca
8 changed files with 59 additions and 27 deletions

View File

@@ -140,11 +140,16 @@ public:
Utils::StyledSeparator *m_toolBoxSeparator; Utils::StyledSeparator *m_toolBoxSeparator;
ActionContainer *m_viewsMenu; ActionContainer *m_viewsMenu;
typedef QPair<Qt::DockWidgetArea, QDockWidget*> ToolWidgetPair; typedef QPair<Qt::DockWidgetArea, QDockWidget*> ToolWidgetPair;
QMap<IAnalyzerTool*, QList<ToolWidgetPair> > m_toolWidgets; typedef QList<ToolWidgetPair> ToolWidgetPairList;
QMap<IAnalyzerTool*, ToolWidgetPairList> m_toolWidgets;
DockWidgetEventFilter *m_resizeEventFilter; DockWidgetEventFilter *m_resizeEventFilter;
QMap<IAnalyzerTool*, QWidget*> m_toolToolbarWidgets; QMap<IAnalyzerTool*, QWidget*> m_toolToolbarWidgets;
QStackedWidget *m_toolbarStackedWidget; QStackedWidget *m_toolbarStackedWidget;
QMap<IAnalyzerTool *, QSettings *> m_defaultSettings; QMap<IAnalyzerTool *, QSettings *> m_defaultSettings;
// list of dock widgets to prevent memory leak
typedef QWeakPointer<QDockWidget> DockPtr;
QList<DockPtr> m_dockWidgets;
}; };
AnalyzerManager::AnalyzerManagerPrivate::AnalyzerManagerPrivate(AnalyzerManager *qq): AnalyzerManager::AnalyzerManagerPrivate::AnalyzerManagerPrivate(AnalyzerManager *qq):
@@ -177,6 +182,12 @@ AnalyzerManager::AnalyzerManagerPrivate::AnalyzerManagerPrivate(AnalyzerManager
AnalyzerManager::AnalyzerManagerPrivate::~AnalyzerManagerPrivate() 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() void AnalyzerManager::AnalyzerManagerPrivate::setupActions()
@@ -561,6 +572,7 @@ QDockWidget *AnalyzerManager::createDockWidget(IAnalyzerTool *tool, const QStrin
QTC_ASSERT(!widget->objectName().isEmpty(), qt_noop()); QTC_ASSERT(!widget->objectName().isEmpty(), qt_noop());
QDockWidget *dockWidget = d->m_mainWindow->addDockForWidget(widget); QDockWidget *dockWidget = d->m_mainWindow->addDockForWidget(widget);
d->m_dockWidgets << AnalyzerManagerPrivate::DockPtr(dockWidget);
dockWidget->setWindowTitle(title); dockWidget->setWindowTitle(title);
d->m_toolWidgets[tool] << qMakePair(area, dockWidget); d->m_toolWidgets[tool] << qMakePair(area, dockWidget);

View File

@@ -76,7 +76,7 @@ void AnalyzerPlugin::AnalyzerPluginPrivate::initialize(const QStringList &argume
{ {
Q_UNUSED(arguments) Q_UNUSED(arguments)
Q_UNUSED(errorString) 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 // Unregister objects from the plugin manager's object pool
// Delete members // Delete members
delete d; delete d;
m_instance = 0;
} }
bool AnalyzerPlugin::initialize(const QStringList &arguments, QString *errorString) bool AnalyzerPlugin::initialize(const QStringList &arguments, QString *errorString)

View File

@@ -53,7 +53,8 @@ static const QLatin1String groupC("Analyzer");
AnalyzerGlobalSettings *AnalyzerGlobalSettings::m_instance = 0; 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; return map;
} }
AnalyzerGlobalSettings::AnalyzerGlobalSettings() AnalyzerGlobalSettings::AnalyzerGlobalSettings(QObject *parent)
: AnalyzerSettings(parent)
{ {
QTC_ASSERT(!m_instance, return); QTC_ASSERT(!m_instance, return);
m_instance = this; m_instance = this;
@@ -106,7 +109,8 @@ AnalyzerGlobalSettings::AnalyzerGlobalSettings()
AnalyzerGlobalSettings *AnalyzerGlobalSettings::instance() AnalyzerGlobalSettings *AnalyzerGlobalSettings::instance()
{ {
if (!m_instance) if (!m_instance)
m_instance = new AnalyzerGlobalSettings; m_instance = new AnalyzerGlobalSettings(AnalyzerPlugin::instance());
return m_instance; return m_instance;
} }
@@ -147,7 +151,7 @@ void AnalyzerGlobalSettings::registerSubConfigFactory(AbstractAnalyzerSubConfigF
{ {
m_subConfigFactories << factory; m_subConfigFactories << factory;
AbstractAnalyzerSubConfig *config = factory->createGlobalSubConfig(); AbstractAnalyzerSubConfig *config = factory->createGlobalSubConfig(this);
addSubConfig(config); addSubConfig(config);
AnalyzerPlugin::instance()->addAutoReleasedObject(new AnalyzerOptionsPage(config)); AnalyzerPlugin::instance()->addAutoReleasedObject(new AnalyzerOptionsPage(config));
@@ -159,11 +163,12 @@ QList<AbstractAnalyzerSubConfigFactory *> AnalyzerGlobalSettings::subConfigFacto
return m_subConfigFactories; return m_subConfigFactories;
} }
AnalyzerProjectSettings::AnalyzerProjectSettings() AnalyzerProjectSettings::AnalyzerProjectSettings(QObject *parent)
: AnalyzerSettings(parent)
{ {
// add sub configs // add sub configs
foreach(AbstractAnalyzerSubConfigFactory *factory, AnalyzerGlobalSettings::instance()->subConfigFactories()) { foreach(AbstractAnalyzerSubConfigFactory *factory, AnalyzerGlobalSettings::instance()->subConfigFactories()) {
addSubConfig(factory->createProjectSubConfig()); addSubConfig(factory->createProjectSubConfig(parent));
} }
// take defaults from global settings // take defaults from global settings
@@ -171,6 +176,10 @@ AnalyzerProjectSettings::AnalyzerProjectSettings()
fromMap(gs->toMap()); fromMap(gs->toMap());
} }
AnalyzerProjectSettings::~AnalyzerProjectSettings()
{
}
QString AnalyzerProjectSettings::displayName() const QString AnalyzerProjectSettings::displayName() const
{ {
return tr("Analyzer Settings"); return tr("Analyzer Settings");

View File

@@ -64,7 +64,7 @@ class ANALYZER_EXPORT AbstractAnalyzerSubConfig : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
AbstractAnalyzerSubConfig(); AbstractAnalyzerSubConfig(QObject *parent);
virtual ~AbstractAnalyzerSubConfig(); virtual ~AbstractAnalyzerSubConfig();
virtual QVariantMap defaults() const = 0; virtual QVariantMap defaults() const = 0;
@@ -86,8 +86,8 @@ public:
AbstractAnalyzerSubConfigFactory(){} AbstractAnalyzerSubConfigFactory(){}
~AbstractAnalyzerSubConfigFactory(){} ~AbstractAnalyzerSubConfigFactory(){}
virtual AbstractAnalyzerSubConfig *createGlobalSubConfig() = 0; virtual AbstractAnalyzerSubConfig *createGlobalSubConfig(QObject *parent) = 0;
virtual AbstractAnalyzerSubConfig *createProjectSubConfig() = 0; virtual AbstractAnalyzerSubConfig *createProjectSubConfig(QObject *parent) = 0;
}; };
/** /**
@@ -103,14 +103,14 @@ class ANALYZER_EXPORT AnalyzerSubConfigFactory : public AbstractAnalyzerSubConfi
public: public:
AnalyzerSubConfigFactory(){} 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); virtual bool fromMap(const QVariantMap &map);
AnalyzerSettings(); AnalyzerSettings(QObject *parent);
}; };
@@ -170,7 +170,7 @@ public:
QList<AbstractAnalyzerSubConfigFactory *> subConfigFactories() const; QList<AbstractAnalyzerSubConfigFactory *> subConfigFactories() const;
private: private:
AnalyzerGlobalSettings(); AnalyzerGlobalSettings(QObject *parent);
static AnalyzerGlobalSettings *m_instance; static AnalyzerGlobalSettings *m_instance;
QList<AbstractAnalyzerSubConfigFactory *> m_subConfigFactories; QList<AbstractAnalyzerSubConfigFactory *> m_subConfigFactories;
}; };
@@ -182,7 +182,8 @@ class ANALYZER_EXPORT AnalyzerProjectSettings : public AnalyzerSettings, public
{ {
Q_OBJECT Q_OBJECT
public: public:
AnalyzerProjectSettings(); AnalyzerProjectSettings(QObject *parent = 0);
virtual ~AnalyzerProjectSettings();
QString displayName() const; QString displayName() const;

View File

@@ -51,7 +51,8 @@ static const QLatin1String addedSuppressionFilesC("Analyzer.Valgrind.AddedSupres
static const QLatin1String filterExternalIssuesC("Analyzer.Valgrind.FilterExternalIssues"); static const QLatin1String filterExternalIssuesC("Analyzer.Valgrind.FilterExternalIssues");
static const QLatin1String visibleErrorKindsC("Analyzer.Valgrind.VisibleErrorKinds"); 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); return new MemcheckConfigWidget(this, parent);
} }
MemcheckGlobalSettings::MemcheckGlobalSettings() MemcheckGlobalSettings::MemcheckGlobalSettings(QObject *parent)
: AbstractMemcheckSettings(parent)
{ {
} }
@@ -201,7 +203,12 @@ MemcheckGlobalSettings *globalMemcheckSettings()
return ret; return ret;
} }
MemcheckProjectSettings::MemcheckProjectSettings() MemcheckProjectSettings::MemcheckProjectSettings(QObject *parent)
: AbstractMemcheckSettings(parent)
{
}
MemcheckProjectSettings::~MemcheckProjectSettings()
{ {
} }

View File

@@ -48,7 +48,7 @@ class AbstractMemcheckSettings : public AbstractAnalyzerSubConfig
{ {
Q_OBJECT Q_OBJECT
public: public:
AbstractMemcheckSettings(); AbstractMemcheckSettings(QObject *parent);
virtual ~AbstractMemcheckSettings(); virtual ~AbstractMemcheckSettings();
virtual bool fromMap(const QVariantMap &map); virtual bool fromMap(const QVariantMap &map);
@@ -98,7 +98,7 @@ class MemcheckGlobalSettings : public AbstractMemcheckSettings
{ {
Q_OBJECT Q_OBJECT
public: public:
MemcheckGlobalSettings(); MemcheckGlobalSettings(QObject *parent);
virtual ~MemcheckGlobalSettings(); virtual ~MemcheckGlobalSettings();
QStringList suppressionFiles() const; QStringList suppressionFiles() const;
@@ -122,7 +122,8 @@ class MemcheckProjectSettings : public AbstractMemcheckSettings
{ {
Q_OBJECT Q_OBJECT
public: public:
MemcheckProjectSettings(); MemcheckProjectSettings(QObject *parent);
virtual ~MemcheckProjectSettings();
QStringList suppressionFiles() const; QStringList suppressionFiles() const;
// in the project-specific settings we store a diff to the global list // in the project-specific settings we store a diff to the global list

View File

@@ -49,7 +49,8 @@ static const QLatin1String groupC("Analyzer");
static const QLatin1String valgrindExeC("Analyzer.Valgrind.ValgrindExecutable"); static const QLatin1String valgrindExeC("Analyzer.Valgrind.ValgrindExecutable");
ValgrindSettings::ValgrindSettings() ValgrindSettings::ValgrindSettings(QObject *parent)
: AbstractAnalyzerSubConfig(parent)
{ {
} }

View File

@@ -53,7 +53,7 @@ class VALGRINDTOOLBASE_EXPORT ValgrindSettings : public AbstractAnalyzerSubConfi
{ {
Q_OBJECT Q_OBJECT
public: public:
ValgrindSettings(); ValgrindSettings(QObject *parent);
virtual ~ValgrindSettings(); virtual ~ValgrindSettings();
virtual QVariantMap toMap() const; virtual QVariantMap toMap() const;