diff options
Diffstat (limited to 'svx')
-rw-r--r-- | svx/source/svdraw/svdmodel.cxx | 22 | ||||
-rw-r--r-- | svx/source/svdraw/svdobj.cxx | 23 |
2 files changed, 44 insertions, 1 deletions
diff --git a/svx/source/svdraw/svdmodel.cxx b/svx/source/svdraw/svdmodel.cxx index 2761af39bea4..a63401dc88e7 100644 --- a/svx/source/svdraw/svdmodel.cxx +++ b/svx/source/svdraw/svdmodel.cxx @@ -204,7 +204,12 @@ void SdrModel::ImpCtor( SdrModel::SdrModel( SfxItemPool* pPool, ::comphelper::IEmbeddedHelper* pPers) -: maMaPag(), +: +#ifdef DBG_UTIL + // SdrObjectLifetimeWatchDog: + maAllIncarnatedObjects(), +#endif + maMaPag(), maPages() { ImpCtor(pPool,pPers); @@ -228,6 +233,21 @@ SdrModel::~SdrModel() ClearModel(true); +#ifdef DBG_UTIL + // SdrObjectLifetimeWatchDog: + if(!maAllIncarnatedObjects.empty()) + { + SAL_WARN("svx","SdrModel::~SdrModel: Not all incarnations of SdrObjects deleted, possible memory leak (!)"); + // copy to std::vector - calling SdrObject::Free will change maAllIncarnatedObjects + const std::vector< const SdrObject* > maRemainingObjects(maAllIncarnatedObjects.begin(), maAllIncarnatedObjects.end()); + for(auto pSdrObject : maRemainingObjects) + { + SdrObject* pCandidate(const_cast<SdrObject*>(pSdrObject)); + SdrObject::Free(pCandidate); + } + } +#endif + pLayerAdmin.reset(); pTextChain.reset(); diff --git a/svx/source/svdraw/svdobj.cxx b/svx/source/svdraw/svdobj.cxx index 0559d7516666..6cd4947da101 100644 --- a/svx/source/svdraw/svdobj.cxx +++ b/svx/source/svdraw/svdobj.cxx @@ -332,6 +332,20 @@ void SdrObject::SetBoundRectDirty() aOutRect = tools::Rectangle(); } +#ifdef DBG_UTIL +// SdrObjectLifetimeWatchDog: +void impAddIncarnatedSdrObjectToSdrModel(const SdrObject& rSdrObject, SdrModel& rSdrModel) +{ + rSdrModel.maAllIncarnatedObjects.insert(&rSdrObject); +} +void impRemoveIncarnatedSdrObjectToSdrModel(const SdrObject& rSdrObject, SdrModel& rSdrModel) +{ + if(!rSdrModel.maAllIncarnatedObjects.erase(&rSdrObject)) + { + SAL_WARN("svx","SdrObject::~SdrObject: Destructed incarnation of SdrObject not member of this SdrModel (!)"); + } +} +#endif SdrObject::SdrObject(SdrModel& rSdrModel) : mpFillGeometryDefiningShape(nullptr) @@ -372,6 +386,10 @@ SdrObject::SdrObject(SdrModel& rSdrModel) bIs3DObj=false; bMarkProt=false; bIsUnoObj=false; +#ifdef DBG_UTIL + // SdrObjectLifetimeWatchDog: + impAddIncarnatedSdrObjectToSdrModel(*this, getSdrModelFromSdrObject()); +#endif } SdrObject::~SdrObject() @@ -396,6 +414,11 @@ SdrObject::~SdrObject() pGrabBagItem.reset(); mpProperties.reset(); mpViewContact.reset(); + +#ifdef DBG_UTIL + // SdrObjectLifetimeWatchDog: + impRemoveIncarnatedSdrObjectToSdrModel(*this, getSdrModelFromSdrObject()); +#endif } void SdrObject::Free( SdrObject*& _rpObject ) |