From 59c78f11c8e5bd9d4c27ab0b30576723c30317cd Mon Sep 17 00:00:00 2001
From: Khaled Noaman <knoaman@apache.org>
Date: Thu, 29 May 2003 13:26:44 +0000
Subject: [PATCH] Fix memory leak when using deprecated dom.

git-svn-id: https://svn.apache.org/repos/asf/xerces/c/trunk@175058 13f79535-47bb-0310-9956-ffa450edef68
---
 src/xercesc/util/ValueStackOf.c    |  8 ++++++--
 src/xercesc/util/ValueStackOf.hpp  |  6 +++++-
 src/xercesc/util/ValueVectorOf.c   | 18 +++++++++++++++---
 src/xercesc/util/ValueVectorOf.hpp |  5 +++++
 4 files changed, 31 insertions(+), 6 deletions(-)

diff --git a/src/xercesc/util/ValueStackOf.c b/src/xercesc/util/ValueStackOf.c
index 766125875..e3d5f5909 100644
--- a/src/xercesc/util/ValueStackOf.c
+++ b/src/xercesc/util/ValueStackOf.c
@@ -56,6 +56,9 @@
 
 /**
  * $Log$
+ * Revision 1.4  2003/05/29 13:26:44  knoaman
+ * Fix memory leak when using deprecated dom.
+ *
  * Revision 1.3  2003/05/16 06:01:52  knoaman
  * Partial implementation of the configurable memory manager.
  *
@@ -97,9 +100,10 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 template <class TElem>
 ValueStackOf<TElem>::ValueStackOf(const unsigned int fInitCapacity,
-                                  MemoryManager* const manager) :
+                                  MemoryManager* const manager,
+                                  const bool toCallDestructor) :
 
-    fVector(fInitCapacity, manager)
+    fVector(fInitCapacity, manager, toCallDestructor)
 {
 }
 
diff --git a/src/xercesc/util/ValueStackOf.hpp b/src/xercesc/util/ValueStackOf.hpp
index 58cec23e0..6257bc63d 100644
--- a/src/xercesc/util/ValueStackOf.hpp
+++ b/src/xercesc/util/ValueStackOf.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.6  2003/05/29 13:26:44  knoaman
+ * Fix memory leak when using deprecated dom.
+ *
  * Revision 1.5  2003/05/16 06:01:52  knoaman
  * Partial implementation of the configurable memory manager.
  *
@@ -114,7 +117,8 @@ public :
     ValueStackOf
     (
           const unsigned int fInitCapacity
-		  , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+          , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+          , const bool toCallDestructor = false
     );
     ~ValueStackOf();
 
diff --git a/src/xercesc/util/ValueVectorOf.c b/src/xercesc/util/ValueVectorOf.c
index 78d0b8200..8c2b83ffd 100644
--- a/src/xercesc/util/ValueVectorOf.c
+++ b/src/xercesc/util/ValueVectorOf.c
@@ -56,6 +56,9 @@
 
 /**
  * $Log$
+ * Revision 1.7  2003/05/29 13:26:44  knoaman
+ * Fix memory leak when using deprecated dom.
+ *
  * Revision 1.6  2003/05/20 21:06:30  knoaman
  * Set values to 0.
  *
@@ -112,9 +115,11 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 template <class TElem>
 ValueVectorOf<TElem>::ValueVectorOf(const unsigned int maxElems,
-                                    MemoryManager* const manager) :
+                                    MemoryManager* const manager,
+                                    const bool toCallDestructor) :
 
-    fCurCount(0)
+    fCallDestructor(toCallDestructor)
+    , fCurCount(0)
     , fMaxCount(maxElems)
     , fElemList(0)
     , fMemoryManager(manager)
@@ -130,7 +135,8 @@ ValueVectorOf<TElem>::ValueVectorOf(const unsigned int maxElems,
 template <class TElem>
 ValueVectorOf<TElem>::ValueVectorOf(const ValueVectorOf<TElem>& toCopy) :
 
-    fCurCount(toCopy.fCurCount)
+    fCallDestructor(toCopy.fCallDestructor)
+    , fCurCount(toCopy.fCurCount)
     , fMaxCount(toCopy.fMaxCount)
     , fElemList(0)
     , fMemoryManager(toCopy.fMemoryManager)
@@ -139,12 +145,18 @@ ValueVectorOf<TElem>::ValueVectorOf(const ValueVectorOf<TElem>& toCopy) :
     (
         fMaxCount * sizeof(TElem)
     ); //new TElem[fMaxCount];
+
+    memset(fElemList, 0, fMaxCount * sizeof(TElem));
     for (unsigned int index = 0; index < fCurCount; index++)
         fElemList[index] = toCopy.fElemList[index];
 }
 
 template <class TElem> ValueVectorOf<TElem>::~ValueVectorOf()
 {
+    if (fCallDestructor) {
+        for (int index= fMaxCount - 1; index >= 0; index--)
+            fElemList[index].~TElem();
+    }
     fMemoryManager->deallocate(fElemList); //delete [] fElemList;
 }
 
diff --git a/src/xercesc/util/ValueVectorOf.hpp b/src/xercesc/util/ValueVectorOf.hpp
index 93f9b09d3..d0871331c 100644
--- a/src/xercesc/util/ValueVectorOf.hpp
+++ b/src/xercesc/util/ValueVectorOf.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.7  2003/05/29 13:26:44  knoaman
+ * Fix memory leak when using deprecated dom.
+ *
  * Revision 1.6  2003/05/16 21:37:00  knoaman
  * Memory manager implementation: Modify constructors to pass in the memory manager.
  *
@@ -120,6 +123,7 @@ public :
     (
         const unsigned int maxElems
         , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+        , const bool toCallDestructor = false
     );
     ValueVectorOf(const ValueVectorOf<TElem>& toCopy);
     ~ValueVectorOf();
@@ -174,6 +178,7 @@ private:
     //      The list of elements, which is dynamically allocated to the needed
     //      size.
     // -----------------------------------------------------------------------
+    bool            fCallDestructor;
     unsigned int    fCurCount;
     unsigned int    fMaxCount;
     TElem*          fElemList;
-- 
GitLab