diff options
author | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2014-07-31 22:09:55 +0200 |
---|---|---|
committer | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2014-07-31 22:14:25 +0200 |
commit | 42cd7a8a26201fa1db98d6498198db23abef87fc (patch) | |
tree | e8a15c2d71ea75404f0cbafedc95a578b1d7a379 /sc | |
parent | 3d6521280929ecacc53b7c358d29d0b5d31b3462 (diff) |
fix memory leak around chart listeners
Found by Lsan.
The following pattern leaks memory:
boost::ptr_container x;
x.release().release();
Change-Id: Iaf52e4f2d6a96266fc6afd65ef8027d80c97a08b
Diffstat (limited to 'sc')
-rw-r--r-- | sc/source/core/tool/chartlis.cxx | 23 |
1 files changed, 8 insertions, 15 deletions
diff --git a/sc/source/core/tool/chartlis.cxx b/sc/source/core/tool/chartlis.cxx index 1fa991a4653a..be5632533959 100644 --- a/sc/source/core/tool/chartlis.cxx +++ b/sc/source/core/tool/chartlis.cxx @@ -519,39 +519,32 @@ public: void ScChartListenerCollection::FreeUnused() { - std::vector<ScChartListener*> aUsed, aUnused; + ListenersType aUsed, aUnused; // First, filter each listener into 'used' and 'unused' categories. { - ListenersType::iterator it = maListeners.begin(), itEnd = maListeners.end(); - for (; it != itEnd; ++it) + while(!maListeners.empty()) { - ScChartListener* p = it->second; + ScChartListener* p = maListeners.begin()->second; if (p->IsUno()) { // We don't delete UNO charts; they are to be deleted separately via FreeUno(). - aUsed.push_back(p); + aUsed.transfer(maListeners.begin(), maListeners); continue; } if (p->IsUsed()) { p->SetUsed(false); - aUsed.push_back(p); + aUsed.transfer(maListeners.begin(), maListeners); } else - aUnused.push_back(p); + aUnused.transfer(maListeners.begin(), maListeners); + } } - // Release all pointers currently managed by the ptr_map container. - maListeners.release().release(); - - // Re-insert the listeners we need to keep. - std::for_each(aUsed.begin(), aUsed.end(), InsertChartListener(maListeners)); - - // Now, delete the ones no longer needed. - std::for_each(aUnused.begin(), aUnused.end(), boost::checked_deleter<ScChartListener>()); + std::swap(aUsed, maListeners); } void ScChartListenerCollection::FreeUno( const uno::Reference< chart::XChartDataChangeEventListener >& rListener, |