summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarkus Mohrhard <markus.mohrhard@googlemail.com>2014-07-31 22:09:55 +0200
committerMarkus Mohrhard <markus.mohrhard@googlemail.com>2014-07-31 22:14:25 +0200
commit42cd7a8a26201fa1db98d6498198db23abef87fc (patch)
treee8a15c2d71ea75404f0cbafedc95a578b1d7a379
parent3d6521280929ecacc53b7c358d29d0b5d31b3462 (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
-rw-r--r--sc/source/core/tool/chartlis.cxx23
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,