summaryrefslogtreecommitdiff
path: root/svx
diff options
context:
space:
mode:
authorArmin Le Grand <Armin.Le.Grand@cib.de>2018-07-27 16:04:07 +0200
committerArmin Le Grand <Armin.Le.Grand@cib.de>2018-07-30 17:52:30 +0200
commitf0dcfe008d58053e52c51b10e51c58eae27c1f0b (patch)
tree1e5b359120d501a7d4acb6051204c3ee5ce30add /svx
parente1d73cb5552c2566c6d7463ce001e555523f3d92 (diff)
Added SdrObjectLifetimeWatchDog for debug mode
Change-Id: I79f65b7511d400c3e7071e45c3f0b1d385bcd8d4 Reviewed-on: https://gerrit.libreoffice.org/58197 Tested-by: Jenkins Reviewed-by: Armin Le Grand <Armin.Le.Grand@cib.de>
Diffstat (limited to 'svx')
-rw-r--r--svx/source/svdraw/svdmodel.cxx22
-rw-r--r--svx/source/svdraw/svdobj.cxx23
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 )