diff options
author | Kohei Yoshida <kyoshida@novell.com> | 2011-07-19 14:46:50 -0400 |
---|---|---|
committer | Petr Mladek <pmladek@suse.cz> | 2011-07-25 17:22:55 +0200 |
commit | e64d3793a10cf6d253384308db3de671a8b4a922 (patch) | |
tree | dff1c1741d09e65341096f4beffc1b155ba50b1c | |
parent | 4117039d868d897cbb71201c0bb075c7ffe52e8a (diff) |
fdo#39236: Prevent double-deletes during removal of pivot tables.
In short, don't use erase remove(_if) idiom to remove objects from
boost ptr containers which would cause double deletes because of
the way remove-like algorithms work. STL's remove-like algorithms
create duplicates of the elements instead of re-ordering them by
design, and this obviously doesn't work well with containers
containing pointers.
IMPORTANT: this will get a better incremental fix
Signed-off-by: David Tardon <dtardon@redhat.com>
Signed-off-by: Petr Mladek <pmladek@suse.cz>
Signed-off-by: Michael Meeks <michael.meeks@novell.com>
Signed-off-by: Markus Mohrhard <markus.mohrhard@googlemail.com>
-rw-r--r-- | sc/source/core/data/dpobject.cxx | 33 |
1 files changed, 9 insertions, 24 deletions
diff --git a/sc/source/core/data/dpobject.cxx b/sc/source/core/data/dpobject.cxx index eda6c16baa2e..9d7eae9608cd 100644 --- a/sc/source/core/data/dpobject.cxx +++ b/sc/source/core/data/dpobject.cxx @@ -83,8 +83,6 @@ using namespace com::sun::star; using ::std::vector; -using ::std::unary_function; -using ::std::remove_if; using ::boost::shared_ptr; using ::com::sun::star::uno::Sequence; using ::com::sun::star::uno::Reference; @@ -2556,25 +2554,6 @@ ScDPCollection::~ScDPCollection() maTables.clear(); } -namespace { - -/** - * Unary predicate to match DP objects by the table ID. - */ -class MatchByTable : public unary_function<bool, ScDPObject> -{ - SCTAB mnTab; -public: - MatchByTable(SCTAB nTab) : mnTab(nTab) {} - - bool operator() (const ScDPObject& rObj) const - { - return rObj.GetOutRange().aStart.Tab() == mnTab; - } -}; - -} - bool ScDPCollection::ClearCache(ScDPObject* pDPObj) { if (pDPObj->IsSheetData()) @@ -2612,9 +2591,15 @@ bool ScDPCollection::ClearCache(ScDPObject* pDPObj) void ScDPCollection::DeleteOnTab( SCTAB nTab ) { - maTables.erase( - remove_if(maTables.begin(), maTables.end(), MatchByTable(nTab)), - maTables.end()); + TablesType aNewTables; + while (!maTables.empty()) + { + TablesType::auto_type xDP = maTables.pop_back(); + if (xDP->GetOutRange().aStart.Tab() != nTab) + // Not on this sheet. Keep it. + aNewTables.push_back(xDP.release()); + } + maTables.swap(aNewTables); } void ScDPCollection::UpdateReference( UpdateRefMode eUpdateRefMode, |