summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorMarkus Mohrhard <markus.mohrhard@googlemail.com>2014-08-15 03:48:25 +0200
committerMarkus Mohrhard <markus.mohrhard@googlemail.com>2014-08-15 03:48:25 +0200
commit1e9baadcb71cb393864be4e8580a50183cb7152e (patch)
tree71e16c858bfd6660c79d00b9ee27c83a7031f7e0 /sc
parent6af3bc396eedde71e40c3e8d714a728c8fa881aa (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.cxx38
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()