[Libreoffice-commits] core.git: 5 commits - sw/source

Michael Stahl mstahl at redhat.com
Fri Apr 24 03:33:29 PDT 2015


 sw/source/core/doc/notxtfrm.cxx    |    8 +++++-
 sw/source/core/docnode/ndsect.cxx  |    2 -
 sw/source/core/docnode/ndtbl.cxx   |    2 -
 sw/source/core/docnode/node.cxx    |    2 -
 sw/source/core/frmedt/tblsel.cxx   |    6 ++--
 sw/source/core/inc/cellfrm.hxx     |    4 ++-
 sw/source/core/inc/cntfrm.hxx      |    4 ++-
 sw/source/core/inc/colfrm.hxx      |    5 +++
 sw/source/core/inc/flyfrm.hxx      |    4 ++-
 sw/source/core/inc/flyfrms.hxx     |    9 ++++---
 sw/source/core/inc/frame.hxx       |    7 +++--
 sw/source/core/inc/layfrm.hxx      |    6 +++-
 sw/source/core/inc/notxtfrm.hxx    |    5 +++
 sw/source/core/inc/pagefrm.hxx     |    4 ++-
 sw/source/core/inc/rootfrm.hxx     |    4 ++-
 sw/source/core/inc/rowfrm.hxx      |    4 ++-
 sw/source/core/inc/sectfrm.hxx     |    5 +++
 sw/source/core/inc/tabfrm.hxx      |    4 ++-
 sw/source/core/inc/txtfrm.hxx      |    5 +++
 sw/source/core/layout/atrfrm.cxx   |    9 +++----
 sw/source/core/layout/colfrm.cxx   |   10 ++++++-
 sw/source/core/layout/flowfrm.cxx  |    6 ++--
 sw/source/core/layout/fly.cxx      |   18 ++++++++------
 sw/source/core/layout/flycnt.cxx   |    4 +--
 sw/source/core/layout/flyincnt.cxx |   10 ++++---
 sw/source/core/layout/flylay.cxx   |    8 +++++-
 sw/source/core/layout/frmtool.cxx  |    8 +++---
 sw/source/core/layout/ftnfrm.cxx   |   32 ++++++++++++-------------
 sw/source/core/layout/hffrm.cxx    |   13 +++++-----
 sw/source/core/layout/layact.cxx   |    2 -
 sw/source/core/layout/layouter.cxx |    4 +--
 sw/source/core/layout/newfrm.cxx   |   11 ++++----
 sw/source/core/layout/pagechg.cxx  |   20 ++++++++-------
 sw/source/core/layout/sectfrm.cxx  |   18 +++++++++-----
 sw/source/core/layout/ssfrm.cxx    |   47 +++++++++++++++++++++++--------------
 sw/source/core/layout/tabfrm.cxx   |   38 ++++++++++++++++++++++-------
 sw/source/core/layout/wsfrm.cxx    |    7 +++--
 sw/source/core/text/frmform.cxx    |    2 -
 sw/source/core/text/txtfrm.cxx     |    8 +++++-
 sw/source/core/txtnode/atrftn.cxx  |    2 -
 sw/source/core/view/vnew.cxx       |    3 +-
 41 files changed, 239 insertions(+), 131 deletions(-)

New commits:
commit 479031567dbc489292eff483fafaae2ad192ff84
Author: Michael Stahl <mstahl at redhat.com>
Date:   Fri Apr 24 11:37:44 2015 +0200

    sw: revert type changes in SwFrm subclass destructors
    
    These should be unnecessary now with DestroyImpl() and might break stuff.
    
    Reverts commits 5a934b2c6085d4e397e1466f8cd6a813f3c2d9d6 and
    db2c0dc78f11c2764f16e7ca4edaf2cdffc56c64.
    
    Change-Id: Ida880dfed9fa6445b3530e2c4788fd4974c8f9c7

diff --git a/sw/source/core/layout/fly.cxx b/sw/source/core/layout/fly.cxx
index 3cac9d7..3d00dcf 100644
--- a/sw/source/core/layout/fly.cxx
+++ b/sw/source/core/layout/fly.cxx
@@ -269,10 +269,6 @@ void SwFlyFrm::DestroyImpl()
 
     FinitDrawObj();
 
-    // Hack to make sure code called from base ~SwLayoutFrm does not interpret
-    // this as a SwFlyFrm (which it no longer is by then):
-    mnFrmType = FRM_UNUSED;
-
     SwLayoutFrm::DestroyImpl();
 }
 
diff --git a/sw/source/core/layout/pagechg.cxx b/sw/source/core/layout/pagechg.cxx
index d49c1e4..9e0475c 100644
--- a/sw/source/core/layout/pagechg.cxx
+++ b/sw/source/core/layout/pagechg.cxx
@@ -264,10 +264,6 @@ void SwPageFrm::DestroyImpl()
         }
     }
 
-    // Hack to make sure code called from base ~SwFtnBossFrm does not interpret
-    // this as a SwPageFrm (which it no longer is by then):
-    mnFrmType = FRM_UNUSED;
-
     SwFtnBossFrm::DestroyImpl();
 }
 
commit f00be42dbf3f9238313a914818cbee9edf708ffa
Author: Michael Stahl <mstahl at redhat.com>
Date:   Fri Apr 24 10:46:40 2015 +0200

    sw: pointless cast
    
    Change-Id: I7cd1d31765d8183a064f5917cac317fcd12c1428

diff --git a/sw/source/core/layout/wsfrm.cxx b/sw/source/core/layout/wsfrm.cxx
index 200a3fa..faf7243 100644
--- a/sw/source/core/layout/wsfrm.cxx
+++ b/sw/source/core/layout/wsfrm.cxx
@@ -655,7 +655,7 @@ void SwFrm::InsertGroupBefore( SwFrm* pParent, SwFrm* pBehind, SwFrm* pSct )
         else
         {
             OSL_ENSURE( pSct->IsSctFrm(), "InsertGroup: For SectionFrms only" );
-            SwFrm::DestroyFrm(static_cast<SwSectionFrm*>(pSct));
+            SwFrm::DestroyFrm(pSct);
         }
     }
     else
commit 8472de571c720934cb9b885565fe5100b475c984
Author: Michael Stahl <mstahl at redhat.com>
Date:   Fri Apr 24 10:46:04 2015 +0200

    sw: merge the SwFrm::Destroy() into SwFrm::DestroyImpl()
    
    Change-Id: Icbf7246cf87d5f3f5e418df6657c5bb07aa99f4b

diff --git a/sw/source/core/inc/frame.hxx b/sw/source/core/inc/frame.hxx
index 56325c3..6df4a5a 100644
--- a/sw/source/core/inc/frame.hxx
+++ b/sw/source/core/inc/frame.hxx
@@ -362,8 +362,6 @@ protected:
     void ColLock()      { mbColLocked = true; }
     void ColUnlock()    { mbColLocked = false; }
 
-    void Destroy(); // for ~SwRootFrm
-
     virtual void DestroyImpl();
     virtual ~SwFrm();
 
diff --git a/sw/source/core/inc/layfrm.hxx b/sw/source/core/inc/layfrm.hxx
index e7810c1..599925f 100644
--- a/sw/source/core/inc/layfrm.hxx
+++ b/sw/source/core/inc/layfrm.hxx
@@ -49,7 +49,6 @@ class SwLayoutFrm: public SwFrm
     void CopySubtree( const SwLayoutFrm *pDest );
 
 protected:
-    void Destroy(); // for ~SwRootFrm
 
     virtual void DestroyImpl() SAL_OVERRIDE;
     virtual ~SwLayoutFrm();
diff --git a/sw/source/core/layout/newfrm.cxx b/sw/source/core/layout/newfrm.cxx
index a3a6609..c0be33a 100644
--- a/sw/source/core/layout/newfrm.cxx
+++ b/sw/source/core/layout/newfrm.cxx
@@ -610,11 +610,6 @@ void SwRootFrm::DestroyImpl()
     // Some accessible shells are left => problems on second SwFrm::Destroy call
     assert(0 == mnAccessibleShells);
 
-    // manually call base classes Destroy because it could call stuff
-    // that accesses members of this
-    SwLayoutFrm::Destroy();
-    SwFrm::Destroy();
-
     SwLayoutFrm::DestroyImpl();
 }
 
diff --git a/sw/source/core/layout/ssfrm.cxx b/sw/source/core/layout/ssfrm.cxx
index 1f8a5f7..8844a38 100644
--- a/sw/source/core/layout/ssfrm.cxx
+++ b/sw/source/core/layout/ssfrm.cxx
@@ -324,7 +324,7 @@ Point SwFrm::GetFrmAnchorPos( bool bIgnoreFlysAnchoredAtThisFrame ) const
     return aAnchor;
 }
 
-void SwFrm::Destroy()
+void SwFrm::DestroyImpl()
 {
     mbInDtor = true;
 
@@ -371,14 +371,6 @@ void SwFrm::Destroy()
     }
 }
 
-void SwFrm::DestroyImpl()
-{
-    if (!IsRootFrm()) // ~SwRootFrm already calls Destroy!
-    {
-        Destroy();
-    }
-}
-
 SwFrm::~SwFrm()
 {
     assert(m_isInDestroy); // check that only DestroySwFrm does "delete"
@@ -453,7 +445,7 @@ void SwCntntFrm::RegisterToNode( SwCntntNode& rNode )
     rNode.Add( this );
 }
 
-void SwLayoutFrm::Destroy()
+void SwLayoutFrm::DestroyImpl()
 {
     while (!m_VertPosOrientFrmsFor.empty())
     {
@@ -547,14 +539,6 @@ void SwLayoutFrm::Destroy()
             pFrm = pNxt;
         }
     }
-}
-
-void SwLayoutFrm::DestroyImpl()
-{
-    if (!IsRootFrm()) // ~SwRootFrm already calls Destroy!
-    {
-        Destroy();
-    }
 
     SwFrm::DestroyImpl();
 }
commit 135e4d5c730b8b252eab3e375580a3a73d8204e6
Author: Michael Stahl <mstahl at redhat.com>
Date:   Thu Apr 23 22:52:39 2015 +0200

    related: tdf#90820 refactor SwFrm destruction
    
    Move all logic out of destructors, so it cannot happen any more that
    members of a sub-class are accessed from a superclass destructor, when
    those members are already dead.
    
    Logic is now in virtual DestroyImpl() methods.
    
    All SwFrms must be deleted with SwFrm::DestroySwFrm().
    
    Change-Id: Icec5b12e12d5a2d955cb5844d7d4f7ac85ab79cd

diff --git a/sw/source/core/doc/notxtfrm.cxx b/sw/source/core/doc/notxtfrm.cxx
index fc799f0..60711a8 100644
--- a/sw/source/core/doc/notxtfrm.cxx
+++ b/sw/source/core/doc/notxtfrm.cxx
@@ -160,9 +160,15 @@ SwCntntFrm *SwNoTxtNode::MakeFrm( SwFrm* pSib )
     return new SwNoTxtFrm(this, pSib);
 }
 
-SwNoTxtFrm::~SwNoTxtFrm()
+void SwNoTxtFrm::DestroyImpl()
 {
     StopAnimation();
+
+    SwCntntFrm::DestroyImpl();
+}
+
+SwNoTxtFrm::~SwNoTxtFrm()
+{
 }
 
 void SetOutDev( SwViewShell *pSh, OutputDevice *pOut )
diff --git a/sw/source/core/docnode/ndsect.cxx b/sw/source/core/docnode/ndsect.cxx
index 746679f..1504807 100644
--- a/sw/source/core/docnode/ndsect.cxx
+++ b/sw/source/core/docnode/ndsect.cxx
@@ -1020,7 +1020,7 @@ SwFrm* SwClearDummies( SwFrm* pFrm )
                     pFrm = pTmp;
                 if( pTmp )
                     pTmp->mpPrev = pSectFrm->GetPrev();
-                delete pSectFrm;
+                SwFrm::DestroyFrm(pSectFrm);
             }
         }
         else
diff --git a/sw/source/core/docnode/ndtbl.cxx b/sw/source/core/docnode/ndtbl.cxx
index da85f7d..78afb54 100644
--- a/sw/source/core/docnode/ndtbl.cxx
+++ b/sw/source/core/docnode/ndtbl.cxx
@@ -2424,7 +2424,7 @@ void SwTableNode::DelFrms()
                     }
                 }
                 pFrm->Cut();
-                delete pFrm;
+                SwFrm::DestroyFrm(pFrm);
                 bAgain = true;
             }
         }
diff --git a/sw/source/core/docnode/node.cxx b/sw/source/core/docnode/node.cxx
index 5e11972..5810b1e 100644
--- a/sw/source/core/docnode/node.cxx
+++ b/sw/source/core/docnode/node.cxx
@@ -1372,7 +1372,7 @@ void SwCntntNode::DelFrms( bool bIsDisposeAccTable )
         pFrm->Cut();
         //Set acc table dispose state to default value
         pFrm->SetAccTableDispose( true );
-        delete pFrm;
+        SwFrm::DestroyFrm(pFrm);
     }
 
     if( bIsDisposeAccTable && IsTxtNode() )
diff --git a/sw/source/core/frmedt/tblsel.cxx b/sw/source/core/frmedt/tblsel.cxx
index d08835d..472be01 100644
--- a/sw/source/core/frmedt/tblsel.cxx
+++ b/sw/source/core/frmedt/tblsel.cxx
@@ -2246,7 +2246,7 @@ void _FndBox::DelFrms( SwTable &rTable, bool bAccTableDispose )
                                     pSctFrm->ColUnlock();
                                 }
                             }
-                            delete pUp;
+                            SwFrm::DestroyFrm(pUp);
                             bDel = false; // Row goes to /dev/null.
                         }
                     }
@@ -2267,7 +2267,7 @@ void _FndBox::DelFrms( SwTable &rTable, bool bAccTableDispose )
                         pFrm->Cut();
                         //Set acc table dispose state to default value.
                         pFrm->SetAccTableDispose( true );
-                        delete pFrm;
+                        SwFrm::DestroyFrm(pFrm);
                     }
                 }
         }
@@ -2291,7 +2291,7 @@ static void lcl_UpdateRepeatedHeadlines( SwTabFrm& rTabFrm, bool bCalcLowers )
     while ( 0 != ( pLower = static_cast<SwRowFrm*>(rTabFrm.Lower()) ) && pLower->IsRepeatedHeadline() )
     {
         pLower->Cut();
-        delete pLower;
+        SwFrm::DestroyFrm(pLower);
     }
 
     // Insert fresh set of headlines:
diff --git a/sw/source/core/inc/cellfrm.hxx b/sw/source/core/inc/cellfrm.hxx
index 5be134c..21b73c4 100644
--- a/sw/source/core/inc/cellfrm.hxx
+++ b/sw/source/core/inc/cellfrm.hxx
@@ -32,13 +32,15 @@ class SwCellFrm: public SwLayoutFrm
 {
     const SwTableBox* m_pTabBox;
 
+    virtual void DestroyImpl() SAL_OVERRIDE;
+    virtual ~SwCellFrm();
+
 protected:
     virtual void Format( const SwBorderAttrs *pAttrs = 0 ) SAL_OVERRIDE;
     virtual void Modify( const SfxPoolItem*, const SfxPoolItem* ) SAL_OVERRIDE;
 
 public:
     SwCellFrm( const SwTableBox &, SwFrm*, bool bInsertContent = true );
-    virtual ~SwCellFrm();
 
     virtual bool GetCrsrOfst( SwPosition *, Point&, SwCrsrMoveState* = 0, bool bTestBackground = false ) const SAL_OVERRIDE;
     virtual void Paint( SwRect const&,
diff --git a/sw/source/core/inc/cntfrm.hxx b/sw/source/core/inc/cntfrm.hxx
index b8fae50..ed32b8b 100644
--- a/sw/source/core/inc/cntfrm.hxx
+++ b/sw/source/core/inc/cntfrm.hxx
@@ -63,8 +63,10 @@ protected:
 
     SwCntntFrm( SwCntntNode * const, SwFrm* );
 
-public:
+    virtual void DestroyImpl() SAL_OVERRIDE;
     virtual ~SwCntntFrm();
+
+public:
     TYPEINFO_OVERRIDE(); // already in base class
 
     virtual void Cut() SAL_OVERRIDE;
diff --git a/sw/source/core/inc/colfrm.hxx b/sw/source/core/inc/colfrm.hxx
index 84d6e87..33036ba 100644
--- a/sw/source/core/inc/colfrm.hxx
+++ b/sw/source/core/inc/colfrm.hxx
@@ -25,9 +25,12 @@
 
 class SwColumnFrm: public SwFtnBossFrm
 {
+private:
+    virtual void DestroyImpl() SAL_OVERRIDE;
+    virtual ~SwColumnFrm();
+
 public:
     SwColumnFrm( SwFrmFmt*, SwFrm* );
-    virtual ~SwColumnFrm();
 
     virtual void PaintBreak() const SAL_OVERRIDE;
     virtual void PaintSubsidiaryLines( const SwPageFrm*, const SwRect& ) const SAL_OVERRIDE;
diff --git a/sw/source/core/inc/flyfrm.hxx b/sw/source/core/inc/flyfrm.hxx
index 174aafd..27ccaa4 100644
--- a/sw/source/core/inc/flyfrm.hxx
+++ b/sw/source/core/inc/flyfrm.hxx
@@ -136,6 +136,9 @@ protected:
 
     SwFlyFrm( SwFlyFrmFmt*, SwFrm*, SwFrm *pAnchor );
 
+    virtual void DestroyImpl() SAL_OVERRIDE;
+    virtual ~SwFlyFrm();
+
     /** method to assure that anchored object is registered at the correct
         page frame
 
@@ -157,7 +160,6 @@ public:
     // #i26791#
     TYPEINFO_OVERRIDE();
 
-    virtual ~SwFlyFrm();
     // get client information
     virtual bool GetInfo( SfxPoolItem& ) const SAL_OVERRIDE;
     virtual void Paint( SwRect const&,
diff --git a/sw/source/core/inc/flyfrms.hxx b/sw/source/core/inc/flyfrms.hxx
index 489e475..5a49cfb 100644
--- a/sw/source/core/inc/flyfrms.hxx
+++ b/sw/source/core/inc/flyfrms.hxx
@@ -64,12 +64,13 @@ protected:
                                    const SwRect& rRect, PrepareHint eHint) SAL_OVERRIDE;
     SwFlyFreeFrm( SwFlyFrmFmt*, SwFrm*, SwFrm *pAnchor );
 
+    virtual void DestroyImpl() SAL_OVERRIDE;
+    virtual ~SwFlyFreeFrm();
+
 public:
     // #i28701#
     TYPEINFO_OVERRIDE();
 
-    virtual ~SwFlyFreeFrm();
-
     virtual void MakeAll() SAL_OVERRIDE;
 
     // #i37068# - accessors for member <mbNoMoveOnCheckClip>
@@ -179,6 +180,9 @@ class SwFlyInCntFrm : public SwFlyFrm
     bool bInvalidLayout :1;
     bool bInvalidCntnt  :1;
 
+    virtual void DestroyImpl() SAL_OVERRIDE;
+    virtual ~SwFlyInCntFrm();
+
 protected:
     virtual void NotifyBackground( SwPageFrm *pPage,
                                    const SwRect& rRect, PrepareHint eHint) SAL_OVERRIDE;
@@ -191,7 +195,6 @@ public:
 
     SwFlyInCntFrm( SwFlyFrmFmt*, SwFrm*, SwFrm *pAnchor );
 
-    virtual ~SwFlyInCntFrm();
     virtual void  Format(  const SwBorderAttrs *pAttrs = 0 ) SAL_OVERRIDE;
 
     void SetRefPoint( const Point& rPoint, const Point &rRelAttr,
diff --git a/sw/source/core/inc/frame.hxx b/sw/source/core/inc/frame.hxx
index 5db5538..56325c3 100644
--- a/sw/source/core/inc/frame.hxx
+++ b/sw/source/core/inc/frame.hxx
@@ -357,12 +357,16 @@ protected:
     bool mbInfSct        : 1;  // Frm is in a section
     bool mbColLocked     : 1;  // lock Grow/Shrink for column-wise section
                                   // or fly frames, will be set in Format
+    bool m_isInDestroy : 1;
 
     void ColLock()      { mbColLocked = true; }
     void ColUnlock()    { mbColLocked = false; }
 
     void Destroy(); // for ~SwRootFrm
 
+    virtual void DestroyImpl();
+    virtual ~SwFrm();
+
     // Only used by SwRootFrm Ctor to get 'this' into mpRoot...
     void setRootFrm( SwRootFrm* pRoot ) { mpRoot = pRoot; }
 
@@ -807,7 +811,8 @@ public:
 
     bool IsColLocked()  const { return mbColLocked; }
 
-    virtual ~SwFrm();
+    /// this is the only way to delete a SwFrm instance
+    static void DestroyFrm(SwFrm *const pFrm);
 
     bool IsInDtor() const { return mbInDtor; }
 
diff --git a/sw/source/core/inc/layfrm.hxx b/sw/source/core/inc/layfrm.hxx
index 7f3774b..e7810c1 100644
--- a/sw/source/core/inc/layfrm.hxx
+++ b/sw/source/core/inc/layfrm.hxx
@@ -47,9 +47,13 @@ class SwLayoutFrm: public SwFrm
 #endif
 
     void CopySubtree( const SwLayoutFrm *pDest );
+
 protected:
     void Destroy(); // for ~SwRootFrm
 
+    virtual void DestroyImpl() SAL_OVERRIDE;
+    virtual ~SwLayoutFrm();
+
     virtual void Format( const SwBorderAttrs *pAttrs = 0 ) SAL_OVERRIDE;
     virtual void MakeAll() SAL_OVERRIDE;
 
@@ -100,7 +104,6 @@ public:
                                    const bool bDefaultExpand = true ) const;
 
     SwLayoutFrm( SwFrmFmt*, SwFrm* );
-    virtual ~SwLayoutFrm();
 
     virtual void Paint( SwRect const&,
                         SwPrintData const*const pPrintData = NULL ) const SAL_OVERRIDE;
diff --git a/sw/source/core/inc/notxtfrm.hxx b/sw/source/core/inc/notxtfrm.hxx
index 452e200..b27642b 100644
--- a/sw/source/core/inc/notxtfrm.hxx
+++ b/sw/source/core/inc/notxtfrm.hxx
@@ -37,12 +37,15 @@ class SwNoTxtFrm: public SwCntntFrm
     void Format ( const SwBorderAttrs *pAttrs = 0 ) SAL_OVERRIDE;
     void PaintCntnt  ( OutputDevice*, const SwRect&, const SwRect& ) const;
     void PaintPicture( OutputDevice*, const SwRect& ) const;
+
+    virtual void DestroyImpl() SAL_OVERRIDE;
+    virtual ~SwNoTxtFrm();
+
 protected:
     virtual void MakeAll() SAL_OVERRIDE;
     virtual void Modify( const SfxPoolItem*, const SfxPoolItem* ) SAL_OVERRIDE;
 public:
     SwNoTxtFrm( SwNoTxtNode * const, SwFrm* );
-    virtual ~SwNoTxtFrm();
 
     virtual void Paint( SwRect const&,
                         SwPrintData const*const pPrintData = NULL ) const SAL_OVERRIDE;
diff --git a/sw/source/core/inc/pagefrm.hxx b/sw/source/core/inc/pagefrm.hxx
index ad3894e..1f19ce7 100644
--- a/sw/source/core/inc/pagefrm.hxx
+++ b/sw/source/core/inc/pagefrm.hxx
@@ -101,6 +101,9 @@ class SwPageFrm: public SwFtnBossFrm
                                      bool bPaintRightShadow,
                                      bool bRightSidebar );
 
+    virtual void DestroyImpl() SAL_OVERRIDE;
+    virtual ~SwPageFrm();
+
 protected:
     virtual void MakeAll() SAL_OVERRIDE;
     virtual void Modify( const SfxPoolItem*, const SfxPoolItem* ) SAL_OVERRIDE;
@@ -110,7 +113,6 @@ public:
     DECL_FIXEDMEMPOOL_NEWDEL(SwPageFrm)
 
     SwPageFrm( SwFrmFmt*, SwFrm*, SwPageDesc* );
-    virtual ~SwPageFrm();
 
     /// Make this public, so that the SwViewShell can access it when switching from browse mode
     /// Add/remove header/footer
diff --git a/sw/source/core/inc/rootfrm.hxx b/sw/source/core/inc/rootfrm.hxx
index b5dc726..63f8faa 100644
--- a/sw/source/core/inc/rootfrm.hxx
+++ b/sw/source/core/inc/rootfrm.hxx
@@ -145,6 +145,9 @@ class SwRootFrm: public SwLayoutFrm
     void _DeleteEmptySct(); // Destroys the registered SectionFrms
     void _RemoveFromList( SwSectionFrm* pSct ); // Removes SectionFrms from the Delete List
 
+    virtual void DestroyImpl() SAL_OVERRIDE;
+    virtual ~SwRootFrm();
+
 protected:
 
     virtual void MakeAll() SAL_OVERRIDE;
@@ -167,7 +170,6 @@ public:
     static bool HasSameRect( const SwRect& rRect );
 
     SwRootFrm( SwFrmFmt*, SwViewShell* );
-    virtual ~SwRootFrm();
     void Init(SwFrmFmt*);
 
     SwViewShell *GetCurrShell() const { return mpCurrShell; }
diff --git a/sw/source/core/inc/rowfrm.hxx b/sw/source/core/inc/rowfrm.hxx
index 93526e9..e59c2d5 100644
--- a/sw/source/core/inc/rowfrm.hxx
+++ b/sw/source/core/inc/rowfrm.hxx
@@ -45,13 +45,15 @@ class SwRowFrm: public SwLayoutFrm
     bool m_bIsRepeatedHeadline;
     bool m_bIsRowSpanLine;
 
+    virtual void DestroyImpl() SAL_OVERRIDE;
+    virtual ~SwRowFrm();
+
 protected:
     virtual void MakeAll() SAL_OVERRIDE;
     virtual void Modify( const SfxPoolItem*, const SfxPoolItem* ) SAL_OVERRIDE;
 
 public:
     SwRowFrm( const SwTableLine &, SwFrm*, bool bInsertContent = true );
-    virtual ~SwRowFrm();
 
     virtual void Cut() SAL_OVERRIDE;
 
diff --git a/sw/source/core/inc/sectfrm.hxx b/sw/source/core/inc/sectfrm.hxx
index 228878e..408d4d9 100644
--- a/sw/source/core/inc/sectfrm.hxx
+++ b/sw/source/core/inc/sectfrm.hxx
@@ -53,6 +53,10 @@ class SwSectionFrm: public SwLayoutFrm, public SwFlowFrm
     void CalcEndAtEndFlag();
     const SwSectionFmt* _GetEndSectFmt() const;
     bool IsEndnoteAtMyEnd() const;
+
+    virtual void DestroyImpl() SAL_OVERRIDE;
+    virtual ~SwSectionFrm();
+
 protected:
     virtual void MakeAll() SAL_OVERRIDE;
     virtual bool ShouldBwdMoved( SwLayoutFrm *pNewUpper, bool bHead, bool &rReformat ) SAL_OVERRIDE;
@@ -63,7 +67,6 @@ protected:
 public:
     SwSectionFrm( SwSection &, SwFrm* ); // Content is not created!
     SwSectionFrm( SwSectionFrm &, bool bMaster ); // _ONLY_ for creating Master/Follows!
-    virtual ~SwSectionFrm();
 
     void Init();
     virtual void CheckDirection( bool bVert ) SAL_OVERRIDE;
diff --git a/sw/source/core/inc/tabfrm.hxx b/sw/source/core/inc/tabfrm.hxx
index 408d7c4..593f114 100644
--- a/sw/source/core/inc/tabfrm.hxx
+++ b/sw/source/core/inc/tabfrm.hxx
@@ -102,6 +102,9 @@ class SwTabFrm: public SwLayoutFrm, public SwFlowFrm
 
     virtual bool ShouldBwdMoved( SwLayoutFrm *pNewUpper, bool bHead, bool &rReformat ) SAL_OVERRIDE;
 
+    virtual void DestroyImpl() SAL_OVERRIDE;
+    virtual ~SwTabFrm();
+
 protected:
     virtual void MakeAll() SAL_OVERRIDE;
     virtual void Format( const SwBorderAttrs *pAttrs = 0 ) SAL_OVERRIDE;
@@ -112,7 +115,6 @@ protected:
 public:
     SwTabFrm( SwTable &, SwFrm* );  // calling Regist Flys always after creation _and_pasting!
     SwTabFrm( SwTabFrm & ); // _only_ for the creation of follows
-    virtual ~SwTabFrm();
 
     void JoinAndDelFollows();   // for DelFrms of the TableNodes!
 
diff --git a/sw/source/core/inc/txtfrm.hxx b/sw/source/core/inc/txtfrm.hxx
index 8cf2633..7588436 100644
--- a/sw/source/core/inc/txtfrm.hxx
+++ b/sw/source/core/inc/txtfrm.hxx
@@ -204,6 +204,10 @@ class SwTxtFrm: public SwCntntFrm
                                  sal_Int32 nInsertPos, sal_Int32 nActPos,
                                  sal_Int32 &nChgStart, sal_Int32 &nChgEnd,
                                  sal_Int32 &nInvStart, sal_Int32 &nInvEnd);
+
+    virtual void DestroyImpl() SAL_OVERRIDE;
+    virtual ~SwTxtFrm();
+
 protected:
     virtual void Modify( const SfxPoolItem*, const SfxPoolItem* ) SAL_OVERRIDE;
 
@@ -333,7 +337,6 @@ public:
         { return static_cast< const SwTxtNode* >( SwCntntFrm::GetNode()); }
 
     SwTxtFrm(SwTxtNode * const, SwFrm* );
-    virtual ~SwTxtFrm();
 
     /**
      * SwCntntFrm: the shortcut for the Frames
diff --git a/sw/source/core/layout/atrfrm.cxx b/sw/source/core/layout/atrfrm.cxx
index dda591b..f92ec8b 100644
--- a/sw/source/core/layout/atrfrm.cxx
+++ b/sw/source/core/layout/atrfrm.cxx
@@ -2645,7 +2645,7 @@ void SwFrmFmt::DelFrms()
     if( pLast )
         do {
                 pLast->Cut();
-                delete pLast;
+                SwFrm::DestroyFrm(pLast);
         } while( 0 != ( pLast = aIter.Next() ));
 }
 
@@ -2852,8 +2852,9 @@ SwFlyFrmFmt::~SwFlyFrmFmt()
     SwIterator<SwFlyFrm,SwFmt> aIter( *this );
     SwFlyFrm * pLast = aIter.First();
     if( pLast )
-        do {
-                delete pLast;
+        do
+        {
+            SwFrm::DestroyFrm(pLast);
         } while( 0 != ( pLast = aIter.Next() ));
 
     SwIterator<SwFlyDrawContact,SwFmt> a2ndIter( *this );
@@ -3269,7 +3270,7 @@ SwHandleAnchorNodeChg::SwHandleAnchorNodeChg( SwFlyFrmFmt& _rFlyFrmFmt,
                         if ( pFrm != _pKeepThisFlyFrm )
                         {
                             pFrm->Cut();
-                            delete pFrm;
+                            SwFrm::DestroyFrm(pFrm);
                         }
                     } while( 0 != ( pFrm = aIter.Next() ));
                 }
diff --git a/sw/source/core/layout/colfrm.cxx b/sw/source/core/layout/colfrm.cxx
index c012fea..23ef755 100644
--- a/sw/source/core/layout/colfrm.cxx
+++ b/sw/source/core/layout/colfrm.cxx
@@ -41,7 +41,7 @@ SwColumnFrm::SwColumnFrm( SwFrmFmt *pFmt, SwFrm* pSib ):
     SetMaxFtnHeight( LONG_MAX );
 }
 
-SwColumnFrm::~SwColumnFrm()
+void SwColumnFrm::DestroyImpl()
 {
     SwFrmFmt *pFmt = GetFmt();
     SwDoc *pDoc;
@@ -52,6 +52,12 @@ SwColumnFrm::~SwColumnFrm()
         pDoc->GetDfltFrmFmt()->Add( this );
         pDoc->DelFrmFmt( pFmt );
     }
+
+    SwFtnBossFrm::DestroyImpl();
+}
+
+SwColumnFrm::~SwColumnFrm()
+{
 }
 
 static void lcl_RemoveColumns( SwLayoutFrm *pCont, sal_uInt16 nCnt )
@@ -71,7 +77,7 @@ static void lcl_RemoveColumns( SwLayoutFrm *pCont, sal_uInt16 nCnt )
     {
         SwColumnFrm *pTmp = static_cast<SwColumnFrm*>(pColumn->GetPrev());
         pColumn->Cut();
-        delete pColumn; //format is going to be destroyed in the DTor if needed.
+        SwFrm::DestroyFrm(pColumn); //format is going to be destroyed in the DTor if needed.
         pColumn = pTmp;
     }
 }
diff --git a/sw/source/core/layout/flowfrm.cxx b/sw/source/core/layout/flowfrm.cxx
index 6c88769..4fc786d 100644
--- a/sw/source/core/layout/flowfrm.cxx
+++ b/sw/source/core/layout/flowfrm.cxx
@@ -397,7 +397,7 @@ SwLayoutFrm *SwFlowFrm::CutTree( SwFrm *pStart )
              !static_cast<SwFtnFrm*>(pLay)->IsBackMoveLocked() )
         {
             pLay->Cut();
-            delete pLay;
+            SwFrm::DestroyFrm(pLay);
         }
         else
         {
@@ -2311,7 +2311,7 @@ bool SwFlowFrm::MoveBwd( bool &rbReformat )
             if( pNewUpper->IsFtnContFrm() )
             {
                 pNewUpper->Cut();
-                delete pNewUpper;
+                SwFrm::DestroyFrm(pNewUpper);
             }
             else
             {
@@ -2322,7 +2322,7 @@ bool SwFlowFrm::MoveBwd( bool &rbReformat )
                      !pSectFrm->ContainsCntnt() && !pSectFrm->ContainsAny( true ) )
                 {
                     pSectFrm->DelEmpty( true );
-                    delete pSectFrm;
+                    SwFrm::DestroyFrm(pSectFrm);
                     m_rThis.mbValidPos = true;
                 }
             }
diff --git a/sw/source/core/layout/fly.cxx b/sw/source/core/layout/fly.cxx
index bdfe3f9..3cac9d7 100644
--- a/sw/source/core/layout/fly.cxx
+++ b/sw/source/core/layout/fly.cxx
@@ -234,7 +234,7 @@ void SwFlyFrm::InsertColumns()
     }
 }
 
-SwFlyFrm::~SwFlyFrm()
+void SwFlyFrm::DestroyImpl()
 {
     // Accessible objects for fly frames will be destroyed in this destructor.
     // For frames bound as char or frames that don't have an anchor we have
@@ -272,6 +272,12 @@ SwFlyFrm::~SwFlyFrm()
     // Hack to make sure code called from base ~SwLayoutFrm does not interpret
     // this as a SwFlyFrm (which it no longer is by then):
     mnFrmType = FRM_UNUSED;
+
+    SwLayoutFrm::DestroyImpl();
+}
+
+SwFlyFrm::~SwFlyFrm()
+{
 }
 
 const IDocumentDrawModelAccess* SwFlyFrm::getIDocumentDrawModelAccess()
@@ -302,7 +308,9 @@ void SwFlyFrm::DeleteCnt()
         {
             SwAnchoredObject *pAnchoredObj = (*pFrm->GetDrawObjs())[0];
             if ( pAnchoredObj->ISA(SwFlyFrm) )
-                delete pAnchoredObj;
+            {
+                SwFrm::DestroyFrm(static_cast<SwFlyFrm*>(pAnchoredObj));
+            }
             else if ( pAnchoredObj->ISA(SwAnchoredDrawObject) )
             {
                 // OD 23.06.2003 #108784# - consider 'virtual' drawing objects
@@ -326,7 +334,7 @@ void SwFlyFrm::DeleteCnt()
         }
 
         pFrm->RemoveFromLayout();
-        delete pFrm;
+        SwFrm::DestroyFrm(pFrm);
         pFrm = m_pLower;
     }
 
@@ -511,7 +519,7 @@ void SwFlyFrm::ChainFrames( SwFlyFrm *pMaster, SwFlyFrm *pFollow )
         SwFrm *pFrm = pFollow->ContainsCntnt();
         OSL_ENSURE( !pFrm->IsTabFrm() && !pFrm->FindNext(), "follow in chain contains content" );
         pFrm->Cut();
-        delete pFrm;
+        SwFrm::DestroyFrm(pFrm);
     }
 
     // invalidate accessible relation set (accessibility wrapper)
diff --git a/sw/source/core/layout/flycnt.cxx b/sw/source/core/layout/flycnt.cxx
index bd6b789..fd59530 100644
--- a/sw/source/core/layout/flycnt.cxx
+++ b/sw/source/core/layout/flycnt.cxx
@@ -732,7 +732,7 @@ static const SwFrm * lcl_CalcDownDist( SwDistance &rRet,
                     {
                         SwFrm *pDel = const_cast<SwFrm*>(pLay);
                         pDel->Cut();
-                        delete pDel;
+                        SwFrm::DestroyFrm(pDel);
                         return pPre;
                     }
                     return 0;
@@ -841,7 +841,7 @@ static const SwFrm * lcl_CalcDownDist( SwDistance &rRet,
                 {
                     SwFrm *pDel = const_cast<SwFrm*>(pLay);
                     pDel->Cut();
-                    delete pDel;
+                    SwFrm::DestroyFrm(pDel);
                     return 0;
                 }
                 return pLay;
diff --git a/sw/source/core/layout/flyincnt.cxx b/sw/source/core/layout/flyincnt.cxx
index 333ed61..1d9c8ba 100644
--- a/sw/source/core/layout/flyincnt.cxx
+++ b/sw/source/core/layout/flyincnt.cxx
@@ -41,13 +41,19 @@ SwFlyInCntFrm::SwFlyInCntFrm( SwFlyFrmFmt *pFmt, SwFrm* pSib, SwFrm *pAnch ) :
     SetCurrRelPos( aRelPos );
 }
 
-SwFlyInCntFrm::~SwFlyInCntFrm()
+void SwFlyInCntFrm::DestroyImpl()
 {
     if ( !GetFmt()->GetDoc()->IsInDtor() && GetAnchorFrm() )
     {
         SwRect aTmp( GetObjRectWithSpaces() );
         SwFlyInCntFrm::NotifyBackground( FindPageFrm(), aTmp, PREP_FLY_LEAVE );
     }
+
+    SwFlyFrm::DestroyImpl();
+}
+
+SwFlyInCntFrm::~SwFlyInCntFrm()
+{
 }
 
 // #i28701#
diff --git a/sw/source/core/layout/flylay.cxx b/sw/source/core/layout/flylay.cxx
index 0243f0d..61ce8bb 100644
--- a/sw/source/core/layout/flylay.cxx
+++ b/sw/source/core/layout/flylay.cxx
@@ -54,7 +54,7 @@ SwFlyFreeFrm::SwFlyFreeFrm( SwFlyFrmFmt *pFmt, SwFrm* pSib, SwFrm *pAnch ) :
 {
 }
 
-SwFlyFreeFrm::~SwFlyFreeFrm()
+void SwFlyFreeFrm::DestroyImpl()
 {
     // #i28701# - use new method <GetPageFrm()>
     if( GetPageFrm() )
@@ -78,6 +78,12 @@ SwFlyFreeFrm::~SwFlyFreeFrm()
             SwFlyFreeFrm::NotifyBackground( GetPageFrm(), aTmp, PREP_FLY_LEAVE );
         }
     }
+
+    SwFlyFrm::DestroyImpl();
+}
+
+SwFlyFreeFrm::~SwFlyFreeFrm()
+{
 }
 
 // #i28701#
diff --git a/sw/source/core/layout/frmtool.cxx b/sw/source/core/layout/frmtool.cxx
index 8323e18..f61907a 100644
--- a/sw/source/core/layout/frmtool.cxx
+++ b/sw/source/core/layout/frmtool.cxx
@@ -1507,7 +1507,7 @@ void _InsertCnt( SwLayoutFrm *pLay, SwDoc *pDoc,
                     pLay = pTmpFrm->GetUpper();
                     pPrv = pTmpFrm->GetPrev();
                     pTmpFrm->RemoveFromLayout();
-                    delete pTmpFrm;
+                    SwFrm::DestroyFrm(pTmpFrm);
                 }
                 else
                 {
@@ -1540,7 +1540,7 @@ void _InsertCnt( SwLayoutFrm *pLay, SwDoc *pDoc,
                     ! pOuterSectionFrm->ContainsCntnt() )
                 {
                     pOuterSectionFrm->DelEmpty( true );
-                    delete pOuterSectionFrm;
+                    SwFrm::DestroyFrm(pOuterSectionFrm);
                 }
                 pActualSection->SetSectionFrm( static_cast<SwSectionFrm*>(pFrm) );
 
@@ -1585,7 +1585,7 @@ void _InsertCnt( SwLayoutFrm *pLay, SwDoc *pDoc,
         if ( !(pLay = pActualSection->GetSectionFrm())->ContainsCntnt() )
         {
             pLay->RemoveFromLayout();
-            delete pLay;
+            SwFrm::DestroyFrm(pLay);
         }
         delete pActualSection;
     }
@@ -1809,7 +1809,7 @@ void MakeFrms( SwDoc *pDoc, const SwNodeIndex &rSttIdx,
                 {
                     pSct->DelEmpty( true );
                     pUpper->getRootFrm()->RemoveFromList( pSct );
-                    delete pSct;
+                    SwFrm::DestroyFrm(pSct);
                 }
             }
         }
diff --git a/sw/source/core/layout/ftnfrm.cxx b/sw/source/core/layout/ftnfrm.cxx
index 51f17f6..6a02d28 100644
--- a/sw/source/core/layout/ftnfrm.cxx
+++ b/sw/source/core/layout/ftnfrm.cxx
@@ -520,7 +520,7 @@ void SwFtnFrm::Cut()
             }
             SwSectionFrm* pSect = pUp->FindSctFrm();
             pUp->Cut();
-            delete pUp;
+            SwFrm::DestroyFrm(pUp);
             // If the last footnote container was removed from a column
             // section without a Follow, then this section can be shrunk.
             if( pSect && !pSect->ToMaximize( false ) && !pSect->IsColLocked() )
@@ -567,7 +567,7 @@ void SwFtnFrm::Paste(  SwFrm* pParent, SwFrm* pSibling )
             MoveSubTree( this, GetLower() );
         SwFrm *pDel = GetPrev();
         pDel->Cut();
-        delete pDel;
+        SwFrm::DestroyFrm(pDel);
     }
     if ( GetNext() && GetNext() == GetFollow() )
     { OSL_ENSURE( SwFlowFrm::CastFlowFrm( GetNext()->GetLower() ),
@@ -575,7 +575,7 @@ void SwFtnFrm::Paste(  SwFrm* pParent, SwFrm* pSibling )
         (SwFlowFrm::CastFlowFrm( GetNext()->GetLower()))->MoveSubTree( this );
         SwFrm *pDel = GetNext();
         pDel->Cut();
-        delete pDel;
+        SwFrm::DestroyFrm(pDel);
     }
 #if OSL_DEBUG_LEVEL > 0
     SwDoc *pDoc = GetFmt()->GetDoc();
@@ -850,7 +850,7 @@ void sw_RemoveFtns( SwFtnBossFrm* pBoss, bool bPageOnly, bool bEndNotes )
                     if ( bPageOnly && !pNxt )
                         pNxt = pFtn->GetFollow();
                     pFtn->Cut();
-                    delete pFtn;
+                    SwFrm::DestroyFrm(pFtn);
                 }
                 pFtn = pNxt;
 
@@ -904,7 +904,7 @@ void SwRootFrm::RemoveFtns( SwPageFrm *pPage, bool bPageOnly, bool bEndNotes )
                 SwFrm *pDel = pPage;
                 pPage = static_cast<SwPageFrm*>(pPage->GetNext());
                 pDel->Cut();
-                delete pDel;
+                SwFrm::DestroyFrm(pDel);
             }
             else
                 pPage = static_cast<SwPageFrm*>(pPage->GetNext());
@@ -1133,7 +1133,7 @@ void SwFtnBossFrm::ResetFtn( const SwFtnFrm *pCheck )
                 {
                     SwFtnFrm *pNxt = pFtn->GetFollow();
                     pFtn->Cut();
-                    delete pFtn;
+                    SwFrm::DestroyFrm(pFtn);
                     pFtn = pNxt;
                 }
             }
@@ -1602,13 +1602,13 @@ void SwFtnBossFrm::AppendFtn( SwCntntFrm *pRef, SwTxtFtn *pAttr )
                  !pNew->IsColLocked() && !pNew->IsBackMoveLocked() )
             {
                 pNew->Cut();
-                delete pNew;
+                SwFrm::DestroyFrm(pNew);
             }
         }
         pMyPage->UpdateFtnNum();
     }
     else
-        delete pNew;
+        SwFrm::DestroyFrm(pNew);
 }
 
 SwFtnFrm *SwFtnBossFrm::FindFtn( const SwCntntFrm *pRef, const SwTxtFtn *pAttr )
@@ -1661,7 +1661,7 @@ void SwFtnBossFrm::RemoveFtn( const SwCntntFrm *pRef, const SwTxtFtn *pAttr,
         {
             SwFtnFrm *pFoll = pFtn->GetFollow();
             pFtn->Cut();
-            delete pFtn;
+            SwFrm::DestroyFrm(pFtn);
             pFtn = pFoll;
         } while ( pFtn );
         if( bPrep && pRef->IsFollow() )
@@ -1868,7 +1868,7 @@ void SwFtnBossFrm::_CollectFtns( const SwCntntFrm*   _pRef,
                 {
                     OSL_ENSURE( !pNxt, "footnote without content?" );
                     pNxt->Cut();
-                    delete pNxt;
+                    SwFrm::DestroyFrm(pNxt);
                 }
                 pNxt = _pFtn->GetFollow();
             }
@@ -1992,7 +1992,7 @@ void SwFtnBossFrm::_MoveFtns( SwFtnFrms &rFtnArr, bool bCalc )
                     if( !pFtn->ContainsAny() && !pFtn->IsColLocked() )
                     {
                         pFtn->Cut();
-                        delete pFtn;
+                        SwFrm::DestroyFrm(pFtn);
                         // #i21478#
                         pFtn = 0L;
                     }
@@ -2010,7 +2010,7 @@ void SwFtnBossFrm::_MoveFtns( SwFtnFrms &rFtnArr, bool bCalc )
         else
         { OSL_ENSURE( !pFtn->GetMaster() && !pFtn->GetFollow(),
                     "DelFtn and Master/Follow?" );
-            delete pFtn;
+            SwFrm::DestroyFrm(pFtn);
             // #i21478#
             pFtn = 0L;
         }
@@ -2187,7 +2187,7 @@ void SwFtnBossFrm::RearrangeFtns( const SwTwips nDeadLine, const bool bLock,
                              !pLastFtnFrm->IsBackMoveLocked() )
                         {
                             pLastFtnFrm->Cut();
-                            delete pLastFtnFrm;
+                            SwFrm::DestroyFrm(pLastFtnFrm);
                             pLastFtnFrm = 0L;
                         }
                     }
@@ -2239,7 +2239,7 @@ void SwFtnBossFrm::RearrangeFtns( const SwTwips nDeadLine, const bool bLock,
                                     "<SwFtnBossFrm::RearrangeFtns(..)> - <pLastFtnFrm> != <pFtnFrm>" );
                             pLastFtnFrm = 0L;
                             pFtnFrm->Cut();
-                            delete pFtnFrm;
+                            SwFrm::DestroyFrm(pFtnFrm);
                         }
                     }
                 }
@@ -2294,7 +2294,7 @@ void SwFtnBossFrm::RearrangeFtns( const SwTwips nDeadLine, const bool bLock,
                 pDel->Cut();
                 if (bUnlockLastFtnFrmGuard)
                     pLastFtnFrm->ColUnlock();
-                delete pDel;
+                SwFrm::DestroyFrm(pDel);
             }
             if ( bMore )
             {
@@ -2322,7 +2322,7 @@ void SwFtnBossFrm::RearrangeFtns( const SwTwips nDeadLine, const bool bLock,
                  !pLastFtnFrm->IsBackMoveLocked() )
             {
                 pLastFtnFrm->Cut();
-                delete pLastFtnFrm;
+                SwFrm::DestroyFrm(pLastFtnFrm);
             }
         }
     }
diff --git a/sw/source/core/layout/hffrm.cxx b/sw/source/core/layout/hffrm.cxx
index 26a87e1..7d4dcb5 100644
--- a/sw/source/core/layout/hffrm.cxx
+++ b/sw/source/core/layout/hffrm.cxx
@@ -654,7 +654,7 @@ void DelFlys( SwLayoutFrm *pFrm, SwPageFrm *pPage )
             SwFlyFrm* pFlyFrm = static_cast<SwFlyFrm*>(pObj);
             if ( pFrm->IsAnLower( pFlyFrm ) )
             {
-                delete pFlyFrm;
+                SwFrm::DestroyFrm(pFlyFrm);
                 // Do not increment index, in this case
                 continue;
             }
@@ -687,7 +687,7 @@ void SwPageFrm::PrepareHeader()
             pLay = static_cast<SwLayoutFrm*>(pLay->GetNext());
             ::DelFlys( pDel, this );
             pDel->Cut();
-            delete pDel;
+            SwFrm::DestroyFrm(pDel);
         }
         OSL_ENSURE( pLay, "Where to with the Header?" );
         SwHeaderFrm *pH = new SwHeaderFrm( const_cast<SwFrmFmt*>(rH.GetHeaderFmt()), this );
@@ -699,7 +699,7 @@ void SwPageFrm::PrepareHeader()
     {   // Remove header if present.
         ::DelFlys( pLay, this );
         pLay->Cut();
-        delete pLay;
+        SwFrm::DestroyFrm(pLay);
     }
 }
 
@@ -725,9 +725,10 @@ void SwPageFrm::PrepareFooter()
             return;  // Footer is already the correct one.
 
         if ( pLay->IsFooterFrm() )
-        {   ::DelFlys( pLay, this );
+        {
+            ::DelFlys( pLay, this );
             pLay->Cut();
-            delete pLay;
+            SwFrm::DestroyFrm(pLay);
         }
         SwFooterFrm *pF = new SwFooterFrm( const_cast<SwFrmFmt*>(rF.GetFooterFmt()), this );
         pF->Paste( this );
@@ -742,7 +743,7 @@ void SwPageFrm::PrepareFooter()
              pShell->VisArea().HasArea() )
             pShell->InvalidateWindows( pShell->VisArea() );
         pLay->Cut();
-        delete pLay;
+        SwFrm::DestroyFrm(pLay);
     }
 }
 
diff --git a/sw/source/core/layout/layact.cxx b/sw/source/core/layout/layact.cxx
index dbc90fd..af7fee2 100644
--- a/sw/source/core/layout/layact.cxx
+++ b/sw/source/core/layout/layact.cxx
@@ -334,7 +334,7 @@ bool SwLayAction::RemoveEmptyBrowserPages()
                 SwPageFrm *pDel = pPage;
                 pPage = static_cast<SwPageFrm*>(pPage->GetNext());
                 pDel->Cut();
-                delete pDel;
+                SwFrm::DestroyFrm(pDel);
             }
         } while ( pPage );
     }
diff --git a/sw/source/core/layout/layouter.cxx b/sw/source/core/layout/layouter.cxx
index 53d8238..80e180c 100644
--- a/sw/source/core/layout/layouter.cxx
+++ b/sw/source/core/layout/layouter.cxx
@@ -94,7 +94,7 @@ void SwEndnoter::CollectEndnote( SwFtnFrm* pFtn )
             { OSL_ENSURE( pNxt->Lower() && pNxt->Lower()->IsSctFrm(),
                         "Endnote without content?" );
                 pNxt->Cut();
-                delete pNxt;
+                SwFrm::DestroyFrm(pNxt);
             }
             pNxt = pFtn->GetFollow();
         }
@@ -109,7 +109,7 @@ void SwEndnoter::CollectEndnote( SwFtnFrm* pFtn )
             SwFtnFrm *pEndFtn = (*pEndArr)[i];
             if( pEndFtn->GetAttr() == pFtn->GetAttr() )
             {
-                delete pFtn;
+                SwFrm::DestroyFrm(pFtn);
                 return;
             }
         }
diff --git a/sw/source/core/layout/newfrm.cxx b/sw/source/core/layout/newfrm.cxx
index 7a204cc..a3a6609 100644
--- a/sw/source/core/layout/newfrm.cxx
+++ b/sw/source/core/layout/newfrm.cxx
@@ -573,7 +573,7 @@ void SwRootFrm::Init( SwFrmFmt* pFmt )
         mbNeedGrammarCheck = pViewSh->GetViewOptions()->IsOnlineSpell();
 }
 
-SwRootFrm::~SwRootFrm()
+void SwRootFrm::DestroyImpl()
 {
     mbTurboAllowed = false;
     mpTurbo = 0;
@@ -614,6 +614,12 @@ SwRootFrm::~SwRootFrm()
     // that accesses members of this
     SwLayoutFrm::Destroy();
     SwFrm::Destroy();
+
+    SwLayoutFrm::DestroyImpl();
+}
+
+SwRootFrm::~SwRootFrm()
+{
 }
 
 void SwRootFrm::RemoveMasterObjs( SdrPage *pPg )
diff --git a/sw/source/core/layout/pagechg.cxx b/sw/source/core/layout/pagechg.cxx
index 6194044..d49c1e4 100644
--- a/sw/source/core/layout/pagechg.cxx
+++ b/sw/source/core/layout/pagechg.cxx
@@ -217,7 +217,7 @@ SwPageFrm::SwPageFrm( SwFrmFmt *pFmt, SwFrm* pSib, SwPageDesc *pPgDsc ) :
     }
 }
 
-SwPageFrm::~SwPageFrm()
+void SwPageFrm::DestroyImpl()
 {
     // Cleanup the header-footer controls in the SwEditWin
     SwViewShell* pSh = getRootFrm()->GetCurrShell();
@@ -267,6 +267,12 @@ SwPageFrm::~SwPageFrm()
     // Hack to make sure code called from base ~SwFtnBossFrm does not interpret
     // this as a SwPageFrm (which it no longer is by then):
     mnFrmType = FRM_UNUSED;
+
+    SwFtnBossFrm::DestroyImpl();
+}
+
+SwPageFrm::~SwPageFrm()
+{
 }
 
 void SwPageFrm::CheckGrid( bool bInvalidate )
@@ -1025,7 +1031,7 @@ void SwFrm::CheckPageDescs( SwPageFrm *pStart, bool bNotifyFields, SwPageFrm** p
                 bool bUpdatePrev = false;
                 if (ppPrev && *ppPrev == pPage)
                     bUpdatePrev = true;
-                delete pPage;
+                SwFrm::DestroyFrm(pPage);
                 if ( pStart == pPage )
                     pStart = pTmp;
                 pPage = pTmp;
@@ -1101,7 +1107,7 @@ void SwFrm::CheckPageDescs( SwPageFrm *pStart, bool bNotifyFields, SwPageFrm** p
                 bool bUpdatePrev = false;
                 if (ppPrev && *ppPrev == pPage)
                     bUpdatePrev = true;
-                delete pPage;
+                SwFrm::DestroyFrm(pPage);
                 if ( pStart == pPage )
                     pStart = pTmp;
                 pPage = pTmp;
@@ -1196,7 +1202,7 @@ SwPageFrm *SwFrm::InsertPage( SwPageFrm *pPrevPage, bool bFtn )
             if ( !pDoc->GetFtnIdxs().empty() )
                 pRoot->RemoveFtns( pDel, true );
             pDel->Cut();
-            delete pDel;
+            SwFrm::DestroyFrm(pDel);
         }
         else
             bCheckPages = true;
@@ -1217,7 +1223,7 @@ SwPageFrm *SwFrm::InsertPage( SwPageFrm *pPrevPage, bool bFtn )
         if ( !pDoc->GetFtnIdxs().empty() )
             pRoot->RemoveFtns( pDel, true );
         pDel->Cut();
-        delete pDel;
+        SwFrm::DestroyFrm(pDel);
     }
     else
         bCheckPages = true;
@@ -1365,7 +1371,7 @@ void SwRootFrm::RemoveSuperfluous()
             if ( !GetFmt()->GetDoc()->GetFtnIdxs().empty() )
                 RemoveFtns( pEmpty, true );
             pEmpty->Cut();
-            delete pEmpty;
+            SwFrm::DestroyFrm(pEmpty);
             nDocPos = pPage ? pPage->Frm().Top() : 0;
         }
     } while ( pPage );
diff --git a/sw/source/core/layout/sectfrm.cxx b/sw/source/core/layout/sectfrm.cxx
index 9b50f93..02c4526 100644
--- a/sw/source/core/layout/sectfrm.cxx
+++ b/sw/source/core/layout/sectfrm.cxx
@@ -117,7 +117,7 @@ void SwSectionFrm::Init()
     }
 }
 
-SwSectionFrm::~SwSectionFrm()
+void SwSectionFrm::DestroyImpl()
 {
     if( GetFmt() && !GetFmt()->GetDoc()->IsInDtor() )
     {
@@ -144,6 +144,12 @@ SwSectionFrm::~SwSectionFrm()
             PROTOCOL( this, PROT_SECTION, ACT_DEL_MASTER, GetFollow() )
         }
     }
+
+    SwLayoutFrm::DestroyImpl();
+}
+
+SwSectionFrm::~SwSectionFrm()
+{
 }
 
 void SwSectionFrm::DelEmpty( bool bRemove )
@@ -262,7 +268,7 @@ void SwSectionFrm::_Cut( bool bRemove )
             pUp->GetUpper() )
         {
             pUp->Cut();
-            delete pUp;
+            SwFrm::DestroyFrm(pUp);
             pUp = NULL;
         }
     }
@@ -443,7 +449,7 @@ void SwSectionFrm::MergeNext( SwSectionFrm* pNxt )
         SetFollow( pNxt->GetFollow() );
         pNxt->SetFollow( NULL );
         pNxt->Cut();
-        delete pNxt;
+        SwFrm::DestroyFrm(pNxt);
         InvalidateSize();
     }
 }
@@ -618,7 +624,7 @@ void SwSectionFrm::MoveCntntAndDelete( SwSectionFrm* pDel, bool bSave )
         static_cast<SwFtnFrm*>(pUp)->ColLock();
     }
     pDel->DelEmpty( true );
-    delete pDel;
+    SwFrm::DestroyFrm(pDel);
     if( pParent )
     {   // Search for the appropriate insert position
         if( pNxtSct && pNxtSct->GetFmt() == pParent )
@@ -2557,7 +2563,7 @@ void SwRootFrm::_DeleteEmptySct()
         {
             SwLayoutFrm* pUp = pSect->GetUpper();
             pSect->RemoveFromLayout();
-            delete pSect;
+            SwFrm::DestroyFrm(pSect);
             if( pUp && !pUp->Lower() )
             {
                 if( pUp->IsPageBodyFrm() )
@@ -2566,7 +2572,7 @@ void SwRootFrm::_DeleteEmptySct()
                     pUp->GetUpper() )
                 {
                     pUp->Cut();
-                    delete pUp;
+                    SwFrm::DestroyFrm(pUp);
                 }
             }
         }
diff --git a/sw/source/core/layout/ssfrm.cxx b/sw/source/core/layout/ssfrm.cxx
index 663733e..1f8a5f7 100644
--- a/sw/source/core/layout/ssfrm.cxx
+++ b/sw/source/core/layout/ssfrm.cxx
@@ -350,7 +350,9 @@ void SwFrm::Destroy()
         {
             SwAnchoredObject* pAnchoredObj = (*mpDrawObjs)[--i];
             if ( pAnchoredObj->ISA(SwFlyFrm) )
-                delete pAnchoredObj;
+            {
+                SwFrm::DestroyFrm(static_cast<SwFlyFrm*>(pAnchoredObj));
+            }
             else
             {
                 SdrObject* pSdrObj = pAnchoredObj->DrawObj();
@@ -369,19 +371,34 @@ void SwFrm::Destroy()
     }
 }
 
-SwFrm::~SwFrm()
+void SwFrm::DestroyImpl()
 {
     if (!IsRootFrm()) // ~SwRootFrm already calls Destroy!
     {
         Destroy();
     }
+}
 
+SwFrm::~SwFrm()
+{
+    assert(m_isInDestroy); // check that only DestroySwFrm does "delete"
 #if OSL_DEBUG_LEVEL > 0
     // JP 15.10.2001: for detection of access to deleted frames
     mpDrawObjs = reinterpret_cast<SwSortedObjs*>(0x33333333);
 #endif
 }
 
+void SwFrm::DestroyFrm(SwFrm *const pFrm)
+{
+    if (pFrm)
+    {
+        pFrm->m_isInDestroy = true;
+        pFrm->DestroyImpl();
+        assert(pFrm->mbInDtor); // check that nobody forgot to call base class
+        delete pFrm;
+    }
+}
+
 const SwFrmFmt * SwLayoutFrm::GetFmt() const
 {
     return static_cast< const SwFrmFmt * >( GetDep() );
@@ -409,7 +426,7 @@ SwCntntFrm::SwCntntFrm( SwCntntNode * const pCntnt, SwFrm* pSib ) :
 {
 }
 
-SwCntntFrm::~SwCntntFrm()
+void SwCntntFrm::DestroyImpl()
 {
     const SwCntntNode* pCNd;
     if( 0 != ( pCNd = PTR_CAST( SwCntntNode, GetRegisteredIn() )) &&
@@ -423,6 +440,12 @@ SwCntntFrm::~SwCntntFrm()
             pRoot->ResetTurbo();
         }
     }
+
+    SwFrm::DestroyImpl();
+}
+
+SwCntntFrm::~SwCntntFrm()
+{
 }
 
 void SwCntntFrm::RegisterToNode( SwCntntNode& rNode )
@@ -458,7 +481,7 @@ void SwLayoutFrm::Destroy()
                 SwAnchoredObject* pAnchoredObj = (*pFrm->GetDrawObjs())[0];
                 if ( pAnchoredObj->ISA(SwFlyFrm) )
                 {
-                    delete pAnchoredObj;
+                    SwFrm::DestroyFrm(static_cast<SwFlyFrm*>(pAnchoredObj));
                     assert(!pFrm->GetDrawObjs() || nCnt > pFrm->GetDrawObjs()->size());
                 }
                 else
@@ -481,7 +504,7 @@ void SwLayoutFrm::Destroy()
                 }
             }
             pFrm->RemoveFromLayout();
-            delete pFrm;
+            SwFrm::DestroyFrm(pFrm);
             pFrm = m_pLower;
         }
         //Delete the Flys, the last one also deletes the array.
@@ -493,7 +516,7 @@ void SwLayoutFrm::Destroy()
             SwAnchoredObject* pAnchoredObj = (*GetDrawObjs())[0];
             if ( pAnchoredObj->ISA(SwFlyFrm) )
             {
-                delete pAnchoredObj;
+                SwFrm::DestroyFrm(static_cast<SwFlyFrm*>(pAnchoredObj));
                 assert(!GetDrawObjs() || nCnt > GetDrawObjs()->size());
             }
             else
@@ -520,18 +543,24 @@ void SwLayoutFrm::Destroy()
         while( pFrm )
         {
             SwFrm *pNxt = pFrm->GetNext();
-            delete pFrm;
+            SwFrm::DestroyFrm(pFrm);
             pFrm = pNxt;
         }
     }
 }
 
-SwLayoutFrm::~SwLayoutFrm()
+void SwLayoutFrm::DestroyImpl()
 {
     if (!IsRootFrm()) // ~SwRootFrm already calls Destroy!
     {
         Destroy();
     }
+
+    SwFrm::DestroyImpl();
+}
+
+SwLayoutFrm::~SwLayoutFrm()
+{
 }
 
 /**
diff --git a/sw/source/core/layout/tabfrm.cxx b/sw/source/core/layout/tabfrm.cxx
index 20145d5..79dc690 100644
--- a/sw/source/core/layout/tabfrm.cxx
+++ b/sw/source/core/layout/tabfrm.cxx
@@ -91,7 +91,7 @@ SwTabFrm::SwTabFrm( SwTable &rTab, SwFrm* pSib )
             pTmpPrev = pNew;
         }
         else
-            delete pNew;
+            SwFrm::DestroyFrm(pNew);
     }
     OSL_ENSURE( Lower() && Lower()->IsRowFrm(), "SwTabFrm::SwTabFrm: No rows." );
 }
@@ -142,7 +142,7 @@ SwTabFrm* SwTabFrm::GetFollowFlowLineFor()
     return NULL;
 }
 
-SwTabFrm::~SwTabFrm()
+void SwTabFrm::DestroyImpl()
 {
     //rhbz#907933, we are a follow flow line for something and have been
     //deleted, remove ourself as a follow flowline
@@ -163,6 +163,12 @@ SwTabFrm::~SwTabFrm()
         pRowCacheLastTabFrm = NULL;
         pRowCacheLastCellFrm= NULL;
     }
+
+    SwLayoutFrm::DestroyImpl();
+}
+
+SwTabFrm::~SwTabFrm()
+{
 }
 
 void SwTabFrm::JoinAndDelFollows()
@@ -172,7 +178,7 @@ void SwTabFrm::JoinAndDelFollows()
         pFoll->JoinAndDelFollows();
     pFoll->Cut();
     SetFollow( pFoll->GetFollow() );
-    delete pFoll;
+    SwFrm::DestroyFrm(pFoll);
 }
 
 void SwTabFrm::RegistFlys()
@@ -414,7 +420,7 @@ static void lcl_MoveRowContent( SwRowFrm& rSourceLine, SwRowFrm& rDestLine )
                     lcl_MoveRowContent( *pTmpSourceRow, *pTmpDestRow );
                     pTmpDestRow->SetFollowRow( pTmpSourceRow->GetFollowRow() );
                     pTmpSourceRow->RemoveFromLayout();
-                    delete pTmpSourceRow;
+                    SwFrm::DestroyFrm(pTmpSourceRow);
                 }
                 else
                 {
@@ -586,7 +592,7 @@ static void lcl_PostprocessRowsInCells( SwTabFrm& rTab, SwRowFrm& rLastLine )
                 pRowFrm->SetFollowRow( pFollowRow->GetFollowRow() );
                 lcl_MoveRowContent( *pFollowRow, *pRowFrm );
                 pFollowRow->Cut();
-                delete pFollowRow;
+                SwFrm::DestroyFrm(pFollowRow);
                 ::SwInvalidateAll( pCurrMasterCell, LONG_MAX );
             }
         }
@@ -855,7 +861,7 @@ bool SwTabFrm::RemoveFollowFlowLine()
 
     bool bJoin = !pFollowFlowLine->GetNext();
     pFollowFlowLine->Cut();
-    delete pFollowFlowLine;
+    SwFrm::DestroyFrm(pFollowFlowLine);
 
     return bJoin;
 }
@@ -1251,7 +1257,7 @@ bool SwTabFrm::Join()
 
         SetFollow( pFoll->GetFollow() );
         SetFollowFlowLine( pFoll->HasFollowFlowLine() );
-        delete pFoll;
+        SwFrm::DestroyFrm(pFoll);
 
         Grow( nHeight );
     }
@@ -3066,7 +3072,7 @@ void SwTabFrm::_UpdateAttr( const SfxPoolItem *pOld, const SfxPoolItem *pNew,
                 while ( 0 != ( pLowerRow = static_cast<SwRowFrm*>(Lower()) ) && pLowerRow->IsRepeatedHeadline() )
                 {
                     pLowerRow->Cut();
-                    delete pLowerRow;
+                    SwFrm::DestroyFrm(pLowerRow);
                 }
 
                 // insert new headlines
@@ -3517,7 +3523,7 @@ SwRowFrm::SwRowFrm(const SwTableLine &rLine, SwFrm* pSib, bool bInsertContent)
     }
 }
 
-SwRowFrm::~SwRowFrm()
+void SwRowFrm::DestroyImpl()
 {
     SwModify* pMod = GetFmt();
     if( pMod )
@@ -3526,6 +3532,12 @@ SwRowFrm::~SwRowFrm()
         if( !pMod->HasWriterListeners() )
             delete pMod;                // and delete
     }
+
+    SwLayoutFrm::DestroyImpl();
+}
+
+SwRowFrm::~SwRowFrm()
+{
 }
 
 void SwRowFrm::RegistFlys( SwPageFrm *pPage )
@@ -4407,7 +4419,7 @@ SwCellFrm::SwCellFrm(const SwTableBox &rBox, SwFrm* pSib, bool bInsertContent)
     }
 }
 
-SwCellFrm::~SwCellFrm()
+void SwCellFrm::DestroyImpl()
 {
     SwModify* pMod = GetFmt();
     if( pMod )
@@ -4425,6 +4437,12 @@ SwCellFrm::~SwCellFrm()
         if( !pMod->HasWriterListeners() )
             delete pMod;                // and delete
     }
+
+    SwLayoutFrm::DestroyImpl();
+}
+
+SwCellFrm::~SwCellFrm()
+{
 }
 
 static bool lcl_ArrangeLowers( SwLayoutFrm *pLay, long lYStart, bool bInva )
diff --git a/sw/source/core/layout/wsfrm.cxx b/sw/source/core/layout/wsfrm.cxx
index 6be1b86..200a3fa 100644
--- a/sw/source/core/layout/wsfrm.cxx
+++ b/sw/source/core/layout/wsfrm.cxx
@@ -69,6 +69,7 @@ SwFrm::SwFrm( SwModify *pMod, SwFrm* pSib ) :
     mbInfFly ( false ),
     mbInfFtn ( false ),
     mbInfSct ( false )
+    , m_isInDestroy(false)
 {
     OSL_ENSURE( pMod, "No frame format given." );
     mbInvalidR2L = mbInvalidVert = true;
@@ -654,7 +655,7 @@ void SwFrm::InsertGroupBefore( SwFrm* pParent, SwFrm* pBehind, SwFrm* pSct )
         else
         {
             OSL_ENSURE( pSct->IsSctFrm(), "InsertGroup: For SectionFrms only" );
-            delete static_cast<SwSectionFrm*>(pSct);
+            SwFrm::DestroyFrm(static_cast<SwSectionFrm*>(pSct));
         }
     }
     else
@@ -958,7 +959,7 @@ void SwCntntFrm::Cut()
                             pTmp->_InvalidatePrt();
                     }
                     pUp->Cut();
-                    delete pUp;
+                    SwFrm::DestroyFrm(pUp);
                 }
                 else
                 {
@@ -975,7 +976,7 @@ void SwCntntFrm::Cut()
                     else
                     {
                         pSct->DelEmpty( true );
-                        delete pSct;
+                        SwFrm::DestroyFrm(pSct);
                     }
                 }
             }
diff --git a/sw/source/core/text/frmform.cxx b/sw/source/core/text/frmform.cxx
index 9ccdf72..abec386 100644
--- a/sw/source/core/text/frmform.cxx
+++ b/sw/source/core/text/frmform.cxx
@@ -666,7 +666,7 @@ SwCntntFrm *SwTxtFrm::JoinFrm()
     }
     pFoll->Cut();
     SetFollow(pNxt);
-    delete pFoll;
+    SwFrm::DestroyFrm(pFoll);
     return pNxt;
 }
 
diff --git a/sw/source/core/text/txtfrm.cxx b/sw/source/core/text/txtfrm.cxx
index ca4b6e3..608b579 100644
--- a/sw/source/core/text/txtfrm.cxx
+++ b/sw/source/core/text/txtfrm.cxx
@@ -376,7 +376,7 @@ SwTxtFrm::SwTxtFrm(SwTxtNode * const pNode, SwFrm* pSib )
     mnFrmType = FRM_TXT;
 }
 
-SwTxtFrm::~SwTxtFrm()
+void SwTxtFrm::DestroyImpl()
 {
     // Remove associated SwParaPortion from pTxtCache
     ClearPara();
@@ -406,6 +406,12 @@ SwTxtFrm::~SwTxtFrm()
             ++nPos;
         }
     }
+
+    SwCntntFrm::DestroyImpl();
+}
+
+SwTxtFrm::~SwTxtFrm()
+{
 }
 
 const OUString& SwTxtFrm::GetTxt() const
diff --git a/sw/source/core/txtnode/atrftn.cxx b/sw/source/core/txtnode/atrftn.cxx
index 5ccaa1f..0d3db11 100644
--- a/sw/source/core/txtnode/atrftn.cxx
+++ b/sw/source/core/txtnode/atrftn.cxx
@@ -482,7 +482,7 @@ void SwTxtFtn::DelFrms( const SwFrm* pSib )
                 {
                     SwFtnFrm *pFoll = pFtn->GetFollow();
                     pFtn->Cut();
-                    delete pFtn;
+                    SwFrm::DestroyFrm(pFtn);
                     pFtn = pFoll;
                 }
 
diff --git a/sw/source/core/view/vnew.cxx b/sw/source/core/view/vnew.cxx
index 5fdaf05..c471908 100644
--- a/sw/source/core/view/vnew.cxx
+++ b/sw/source/core/view/vnew.cxx
@@ -126,7 +126,8 @@ void SwViewShell::Init( const SwViewOption *pNewOpt )
         if( !mpLayout )
         {
             // switched to two step construction because creating the layout in SwRootFrm needs a valid pLayout set
-            mpLayout = SwRootFrmPtr(new SwRootFrm( mpDoc->GetDfltFrmFmt(), this ));
+            mpLayout = SwRootFrmPtr(new SwRootFrm(mpDoc->GetDfltFrmFmt(), this),
+                                    &SwFrm::DestroyFrm);
             mpLayout->Init( mpDoc->GetDfltFrmFmt() );
         }
     }
commit 4e353190b68f3a89c43b3861444dd2dd6b02a6e0
Author: Michael Stahl <mstahl at redhat.com>
Date:   Thu Apr 23 20:57:38 2015 +0200

    tdf#90820: Revert "Hack to make an in-destruction SwFlyInCntFrm ...
    
    ... no longer claim to be one"
    
    This reverts commit e49ca69747e9e905dbb00bbd5a7ea85331607a04.
    
    The problem is that superclass dtor does not dispose the accessible object
    for the SwFlyInCntFrm because in ~SwFlyFrm the IsAccessibleFrm() and
    IsFlyInCntFrm() return false.
    
    Change-Id: Id7018d50f30da5f8e2f0df307453a55a5f2cff69

diff --git a/sw/source/core/layout/flyincnt.cxx b/sw/source/core/layout/flyincnt.cxx
index 71f235f..333ed61 100644
--- a/sw/source/core/layout/flyincnt.cxx
+++ b/sw/source/core/layout/flyincnt.cxx
@@ -48,10 +48,6 @@ SwFlyInCntFrm::~SwFlyInCntFrm()
         SwRect aTmp( GetObjRectWithSpaces() );
         SwFlyInCntFrm::NotifyBackground( FindPageFrm(), aTmp, PREP_FLY_LEAVE );
     }
-
-    // Hack to make sure code called from base ~SwFlyFrm does not interpret this
-    // as a SwFlyFrm (which it no longer is by then):
-    mnFrmType = FRM_UNUSED;
 }
 
 // #i28701#


More information about the Libreoffice-commits mailing list