From 1e9baadcb71cb393864be4e8580a50183cb7152e Mon Sep 17 00:00:00 2001 From: Markus Mohrhard Date: Fri, 15 Aug 2014 03:48:25 +0200 Subject: another memory leak based on release().release() Thanks Michael Meeks for noticing. Change-Id: I8c27215d3cf4624a19f4fd905758e588b342c6c9 --- sc/source/core/tool/chartlis.cxx | 38 ++++++-------------------------------- 1 file changed, 6 insertions(+), 32 deletions(-) (limited to 'sc') 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 -{ - 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 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()); + std::swap(aUsed, maListeners); } void ScChartListenerCollection::StartTimer() -- cgit