From: Manuel Nickschas Date: Tue, 4 Sep 2018 21:19:22 +0000 (+0200) Subject: clang-tidy: Avoid potential memory leak in BufferViewManager X-Git-Tag: 0.13-rc2~45 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=7fef34357cbd749e119dc3c47dda0ba63d068a03;ds=sidebyside clang-tidy: Avoid potential memory leak in BufferViewManager Explicitly delete a freshly created BufferViewConfig in case it cannot be added, rather than relying on QObject parentship - clang-tidy warns about that. I'm rather sure that this is a false positive, but better safe than sorry. Simplify and clean-up related code a bit. --- diff --git a/src/common/bufferviewmanager.cpp b/src/common/bufferviewmanager.cpp index 64af01e2..41cdd463 100644 --- a/src/common/bufferviewmanager.cpp +++ b/src/common/bufferviewmanager.cpp @@ -47,25 +47,28 @@ BufferViewConfig *BufferViewManager::bufferViewConfigFactory(int bufferViewConfi } -void BufferViewManager::addBufferViewConfig(BufferViewConfig *config) +void BufferViewManager::addBufferViewConfig(int bufferViewConfigId) { - if (_bufferViewConfigs.contains(config->bufferViewId())) + if (_bufferViewConfigs.contains(bufferViewConfigId)) { return; + } - _proxy->synchronize(config); - _bufferViewConfigs[config->bufferViewId()] = config; - int bufferViewId = config->bufferViewId(); - SYNC_OTHER(addBufferViewConfig, ARG(bufferViewId)) - emit bufferViewConfigAdded(bufferViewId); + addBufferViewConfig(bufferViewConfigFactory(bufferViewConfigId)); } -void BufferViewManager::addBufferViewConfig(int bufferViewConfigId) +void BufferViewManager::addBufferViewConfig(BufferViewConfig *config) { - if (_bufferViewConfigs.contains(bufferViewConfigId)) + if (_bufferViewConfigs.contains(config->bufferViewId())) { + delete config; return; + } - addBufferViewConfig(bufferViewConfigFactory(bufferViewConfigId)); + _proxy->synchronize(config); + _bufferViewConfigs[config->bufferViewId()] = config; + int bufferViewId = config->bufferViewId(); + SYNC_OTHER(addBufferViewConfig, ARG(bufferViewId)) + emit bufferViewConfigAdded(bufferViewId); } @@ -96,10 +99,7 @@ QVariantList BufferViewManager::initBufferViewIds() const void BufferViewManager::initSetBufferViewIds(const QVariantList bufferViewIds) { - QVariantList::const_iterator iter = bufferViewIds.constBegin(); - QVariantList::const_iterator iterEnd = bufferViewIds.constEnd(); - while (iter != iterEnd) { - newBufferViewConfig((*iter).value()); - ++iter; + for (auto &&id : bufferViewIds) { + addBufferViewConfig(id.value()); } } diff --git a/src/common/bufferviewmanager.h b/src/common/bufferviewmanager.h index 887d3382..fcfb7d09 100644 --- a/src/common/bufferviewmanager.h +++ b/src/common/bufferviewmanager.h @@ -43,12 +43,6 @@ public: BufferViewConfig *bufferViewConfig(int bufferViewId) const; public slots: - void addBufferViewConfig(BufferViewConfig *config); - void addBufferViewConfig(int bufferViewConfigId); - inline void newBufferViewConfig(int bufferViewConfigId) { addBufferViewConfig(bufferViewConfigId); } - - void deleteBufferViewConfig(int bufferViewConfigId); - QVariantList initBufferViewIds() const; void initSetBufferViewIds(const QVariantList bufferViewIds); @@ -70,6 +64,10 @@ protected: inline const BufferViewConfigHash &bufferViewConfigHash() { return _bufferViewConfigs; } virtual BufferViewConfig *bufferViewConfigFactory(int bufferViewConfigId); + void addBufferViewConfig(BufferViewConfig *config); + void addBufferViewConfig(int bufferViewConfigId); + void deleteBufferViewConfig(int bufferViewConfigId); + private: BufferViewConfigHash _bufferViewConfigs; SignalProxy *_proxy; diff --git a/src/core/corebufferviewmanager.cpp b/src/core/corebufferviewmanager.cpp index e79a6d65..87a41922 100644 --- a/src/core/corebufferviewmanager.cpp +++ b/src/core/corebufferviewmanager.cpp @@ -74,8 +74,7 @@ void CoreBufferViewManager::requestCreateBufferView(const QVariantMap &propertie } maxId++; - CoreBufferViewConfig *config = new CoreBufferViewConfig(maxId, properties); - addBufferViewConfig(config); + addBufferViewConfig(new CoreBufferViewConfig(maxId, properties, this)); }