From 95e7ce4bd28faed42ac90dda69c08e06b28aa34d Mon Sep 17 00:00:00 2001
From: Alberto Massari <amassari@apache.org>
Date: Wed, 26 Jan 2005 13:29:32 +0000
Subject: [PATCH] - Removed warning about exception classes having a base class
 with a protected copy constructor (jira# 1323) - Added placement new and
 delete to allow XMemory-derived classes to be hosted in STL containers

git-svn-id: https://svn.apache.org/repos/asf/xerces/c/trunk@176295 13f79535-47bb-0310-9956-ffa450edef68
---
 src/xercesc/util/XMemory.cpp |  9 +++++++++
 src/xercesc/util/XMemory.hpp | 32 ++++++++++++++++++++------------
 2 files changed, 29 insertions(+), 12 deletions(-)

diff --git a/src/xercesc/util/XMemory.cpp b/src/xercesc/util/XMemory.cpp
index 08a47c7c8..e4261885b 100644
--- a/src/xercesc/util/XMemory.cpp
+++ b/src/xercesc/util/XMemory.cpp
@@ -69,6 +69,11 @@ void* XMemory::operator new(size_t size, MemoryManager* manager)
     return (char*)block + headerSize;
 }
 
+void* XMemory::operator new(size_t /*size*/, void* ptr)
+{
+    return ptr;
+}
+
 void XMemory::operator delete(void* p)
 {
     if (p != 0)
@@ -107,6 +112,10 @@ void XMemory::operator delete(void* p, MemoryManager* manager)
     }
 }
 
+void XMemory::operator delete(void* /*p*/, void* /*ptr*/)
+{
+}
+
 #endif
 
 XERCES_CPP_NAMESPACE_END
diff --git a/src/xercesc/util/XMemory.hpp b/src/xercesc/util/XMemory.hpp
index 1058b3f4f..9fbbe13af 100644
--- a/src/xercesc/util/XMemory.hpp
+++ b/src/xercesc/util/XMemory.hpp
@@ -73,13 +73,22 @@ public :
 #endif
 
     /**
-      * This method overrides placement operator new
+      * This method defines a custom operator new, that will use the provided
+      * memory manager to perform the allocation
       *
       * @param size   The requested memory size
       * @param memMgr An application's memory manager
       */
     void* operator new(size_t size, MemoryManager* memMgr);
 
+    /**
+      * This method overrides placement operator new
+      *
+      * @param size   The requested memory size
+      * @param ptr    The memory location where the object should be allocated
+      */
+    void* operator new(size_t size, void* ptr);
+
     /**
       * This method overrides operator delete
       *
@@ -90,12 +99,20 @@ public :
      //The Borland compiler is complaining about duplicate overloading of delete
 #if !defined(XML_BORLAND)
     /**
-      * This method provides a matching delete for the placement new
+      * This method provides a matching delete for the custom operator new
       *
       * @param p      The pointer to the allocated memory
       * @param memMgr An application's memory manager 
       */
     void operator delete(void* p, MemoryManager* memMgr);
+
+    /**
+      * This method provides a matching delete for the placement new
+      *
+      * @param p      The pointer to the allocated memory
+      * @param ptr    The memory location where the object had to be allocated
+      */
+    void operator delete(void* p, void* ptr);
 #endif
 
     //@}
@@ -108,15 +125,11 @@ protected :
     //@{
 
     /**
-      * Protected default constructor and copy constructor
+      * Protected default constructor
       */
     XMemory()
     {
     }
-
-    XMemory(const XMemory&)
-    {
-    }
     //@}
 
 #if defined(XML_BORLAND)
@@ -125,11 +138,6 @@ protected :
     }
 #endif
 
-private:
-    // -----------------------------------------------------------------------
-    //  Unimplemented operators
-    // -----------------------------------------------------------------------
-    XMemory& operator=(const XMemory&);
 };
 
 XERCES_CPP_NAMESPACE_END
-- 
GitLab