瀏覽代碼

iostreamlib: fix memory manager

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@71625 15284696-431f-4ddb-bdfa-cd5b030d7da7
Markus Metz 7 年之前
父節點
當前提交
42edb8d293
共有 2 個文件被更改,包括 35 次插入22 次删除
  1. 11 9
      include/iostream/mm.h
  2. 24 13
      lib/iostream/mm.cpp

+ 11 - 9
include/iostream/mm.h

@@ -132,18 +132,20 @@ public:
  
  
   void print();
   void print();
 
 
-  friend class mm_register_init;
+  // make these members of MM_register
 #ifdef GRASS_MM_USE_EXCEPTION_SPECIFIER
 #ifdef GRASS_MM_USE_EXCEPTION_SPECIFIER
-  friend void * operator new(size_t) throw (std::bad_alloc);
-  friend void * operator new[] (size_t) throw (std::bad_alloc);
-  friend void operator delete(void *) throw();
-  friend void operator delete[](void *) throw();
+  void * operator new(size_t) throw (std::bad_alloc);
+  void * operator new[] (size_t) throw (std::bad_alloc);
+  void operator delete(void *) throw();
+  void operator delete[](void *) throw();
 #else
 #else
-  friend void * operator new(size_t);
-  friend void * operator new[] (size_t);
-  friend void operator delete(void *) noexcept;
-  friend void operator delete[](void *) noexcept;
+  void * operator new(size_t);
+  void * operator new[] (size_t);
+  void operator delete(void *) noexcept;
+  void operator delete[](void *) noexcept;
 #endif /* GRASS_MM_USE_EXCEPTION_SPECIFIER */
 #endif /* GRASS_MM_USE_EXCEPTION_SPECIFIER */
+
+  friend class mm_register_init;
 };
 };
 
 
 
 

+ 24 - 13
lib/iostream/mm.cpp

@@ -276,13 +276,18 @@ MM_err MM_register::register_deallocation(size_t sz) {
 
 
  
  
 /* ************************************************************ */
 /* ************************************************************ */
+/* these overloaded operators must only be used by this memory manager
+ * risk of invalid free if these operators are defined outside the MM_register class
+ * e.g. GDAL allocating memory with something else than new as defined here
+ * but then using delete as defined here 
+ */
 #ifdef GRASS_MM_USE_EXCEPTION_SPECIFIER
 #ifdef GRASS_MM_USE_EXCEPTION_SPECIFIER
-void* operator new[] (size_t sz) throw (std::bad_alloc) {
+void* MM_register::operator new[] (size_t sz) throw (std::bad_alloc) {
 #else
 #else
-void* operator new[] (size_t sz) {
+void* MM_register::operator new[] (size_t sz) {
 #endif /* GRASS_MM_USE_EXCEPTION_SPECIFIER */
 #endif /* GRASS_MM_USE_EXCEPTION_SPECIFIER */
   void *p;
   void *p;
-  
+
   MM_DEBUG cout << "new: sz=" << sz << ", register " 
   MM_DEBUG cout << "new: sz=" << sz << ", register " 
 		<< sz+SIZE_SPACE << "B ,"; 
 		<< sz+SIZE_SPACE << "B ,"; 
 
 
@@ -320,7 +325,7 @@ void* operator new[] (size_t sz) {
     assert(0);
     assert(0);
     exit (1);
     exit (1);
   }
   }
-  
+
   *((size_t *) p) = sz;
   *((size_t *) p) = sz;
   
   
   MM_DEBUG cout << "ptr=" << (void*) (((char *) p) + SIZE_SPACE) << endl;
   MM_DEBUG cout << "ptr=" << (void*) (((char *) p) + SIZE_SPACE) << endl;
@@ -332,12 +337,12 @@ void* operator new[] (size_t sz) {
  
  
 /* ************************************************************ */
 /* ************************************************************ */
 #ifdef GRASS_MM_USE_EXCEPTION_SPECIFIER
 #ifdef GRASS_MM_USE_EXCEPTION_SPECIFIER
-void* operator new (size_t sz) throw (std::bad_alloc) {
+void* MM_register::operator new (size_t sz) throw (std::bad_alloc) {
 #else
 #else
-void* operator new (size_t sz) {
+void* MM_register::operator new (size_t sz) {
 #endif /* GRASS_MM_USE_EXCEPTION_SPECIFIER */
 #endif /* GRASS_MM_USE_EXCEPTION_SPECIFIER */
   void *p;
   void *p;
-  
+
   MM_DEBUG cout << "new: sz=" << sz << ", register " 
   MM_DEBUG cout << "new: sz=" << sz << ", register " 
 		<< sz+SIZE_SPACE << "B ,"; 
 		<< sz+SIZE_SPACE << "B ,"; 
 
 
@@ -375,7 +380,7 @@ void* operator new (size_t sz) {
     assert(0);
     assert(0);
     exit (1);
     exit (1);
   }
   }
-  
+
   *((size_t *) p) = sz;
   *((size_t *) p) = sz;
   
   
   MM_DEBUG cout << "ptr=" << (void*) (((char *) p) + SIZE_SPACE) << endl;
   MM_DEBUG cout << "ptr=" << (void*) (((char *) p) + SIZE_SPACE) << endl;
@@ -388,13 +393,13 @@ void* operator new (size_t sz) {
 
 
 /* ---------------------------------------------------------------------- */
 /* ---------------------------------------------------------------------- */
 #ifdef GRASS_MM_USE_EXCEPTION_SPECIFIER
 #ifdef GRASS_MM_USE_EXCEPTION_SPECIFIER
-void operator delete (void *ptr) throw() {
+void MM_register::operator delete (void *ptr) throw() {
 #else
 #else
-void operator delete (void *ptr) noexcept {
+void MM_register::operator delete (void *ptr) noexcept {
 #endif /* GRASS_MM_USE_EXCEPTION_SPECIFIER */
 #endif /* GRASS_MM_USE_EXCEPTION_SPECIFIER */
   size_t sz;
   size_t sz;
   void *p;
   void *p;
-  
+
   MM_DEBUG cout << "delete: ptr=" << ptr << ","; 
   MM_DEBUG cout << "delete: ptr=" << ptr << ","; 
 
 
   if (!ptr) {
   if (!ptr) {
@@ -411,6 +416,9 @@ void operator delete (void *ptr) noexcept {
   }
   }
   
   
   assert(ptr);
   assert(ptr);
+
+  /* causes invalid free if ptr has not been allocated with new as 
+   * defined above */
   p = ((char *)ptr) - SIZE_SPACE; // the base of memory
   p = ((char *)ptr) - SIZE_SPACE; // the base of memory
   sz = *((size_t *)p);
   sz = *((size_t *)p);
   
   
@@ -432,9 +440,9 @@ void operator delete (void *ptr) noexcept {
 
 
 /* ---------------------------------------------------------------------- */
 /* ---------------------------------------------------------------------- */
 #ifdef GRASS_MM_USE_EXCEPTION_SPECIFIER
 #ifdef GRASS_MM_USE_EXCEPTION_SPECIFIER
-void operator delete[] (void *ptr) throw() {
+void MM_register::operator delete[] (void *ptr) throw() {
 #else
 #else
-void operator delete[] (void *ptr) noexcept {
+void MM_register::operator delete[] (void *ptr) noexcept {
 #endif /* GRASS_MM_USE_EXCEPTION_SPECIFIER */
 #endif /* GRASS_MM_USE_EXCEPTION_SPECIFIER */
   size_t sz;
   size_t sz;
   void *p;
   void *p;
@@ -450,6 +458,9 @@ void operator delete[] (void *ptr) noexcept {
     return;
     return;
   }
   }
    assert(ptr);
    assert(ptr);
+
+  /* causes invalid free if ptr has not been allocated with new as 
+   * defined above */
    p = ((char *)ptr) - SIZE_SPACE; // the base of memory
    p = ((char *)ptr) - SIZE_SPACE; // the base of memory
    sz = *((size_t *)p);
    sz = *((size_t *)p);