diff options
author | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2014-08-15 03:48:25 +0200 |
---|---|---|
committer | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2014-08-15 03:48:25 +0200 |
commit | 1e9baadcb71cb393864be4e8580a50183cb7152e (patch) | |
tree | 71e16c858bfd6660c79d00b9ee27c83a7031f7e0 /sc | |
parent | 6af3bc396eedde71e40c3e8d714a728c8fa881aa (diff) |
another memory leak based on release().release()
Thanks Michael Meeks for noticing.
Change-Id: I8c27215d3cf4624a19f4fd905758e588b342c6c9
Diffstat (limited to 'sc')
-rw-r--r-- | sc/source/core/tool/chartlis.cxx | 38 |
1 files changed, 6 insertions, 32 deletions
diff --git a/sc/source/core/tool/chartlis.cxx b/sc/source/core/tool/chartlis.cxx index be5632533959..57778a6c6a54 100644 --- a/sc/source/core/tool/chartlis.cxx +++ b/sc/source/core/tool/chartlis.cxx @@ -499,24 +499,6 @@ void ScChartListenerCollection::ChangeListening( const OUString& rName, pCL->SetDirty( true ); } -namespace { - -class InsertChartListener : public std::unary_function<ScChartListener*, void> -{ - ScChartListenerCollection::ListenersType& mrListeners; -public: - InsertChartListener(ScChartListenerCollection::ListenersType& rListeners) : - mrListeners(rListeners) {} - - void operator() (ScChartListener* p) - { - OUString aName = p->GetName(); - mrListeners.insert(aName, p); - } -}; - -} - void ScChartListenerCollection::FreeUnused() { ListenersType aUsed, aUnused; @@ -550,29 +532,21 @@ void ScChartListenerCollection::FreeUnused() void ScChartListenerCollection::FreeUno( const uno::Reference< chart::XChartDataChangeEventListener >& rListener, const uno::Reference< chart::XChartData >& rSource ) { - 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() && p->GetUnoListener() == rListener && p->GetUnoSource() == rSource) - aUnused.push_back(p); + aUnused.transfer(maListeners.begin(), maListeners); else - aUsed.push_back(p); + aUsed.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::StartTimer() |