malloc_allocator.h: Fixed the construct function to call global placement new instead...
authorDhruv Matani <dhruvbird@gmx.net>
Wed, 24 Mar 2004 21:40:01 +0000 (21:40 +0000)
committerBenjamin Kosnik <bkoz@gcc.gnu.org>
Wed, 24 Mar 2004 21:40:01 +0000 (21:40 +0000)
2004-03-24  Dhruv Matani  <dhruvbird@gmx.net>

* ext/malloc_allocator.h: Fixed the construct function to call
global placement new instead of assignment. Added a check after
the return from malloc to check whether returned pointer is NULL,
and if so, throw std::bad_alloc().
* ext/debug_allocator.h: Added a check in the deallocate function
to check whether the user has passed a NULL pointer or not.

From-SVN: r79934

libstdc++-v3/ChangeLog
libstdc++-v3/include/ext/debug_allocator.h
libstdc++-v3/include/ext/malloc_allocator.h

index 77ca7ea..0ab5641 100644 (file)
@@ -1,3 +1,12 @@
+2004-03-24  Dhruv Matani  <dhruvbird@gmx.net>
+
+       * ext/malloc_allocator.h: Fixed the construct function to call
+       global placement new instead of assignment. Added a check after
+       the return from malloc to check whether returned pointer is NULL,
+       and if so, throw std::bad_alloc().
+       * ext/debug_allocator.h: Added a check in the deallocate function
+       to check whether the user has passed a NULL pointer or not.
+       
 2004-03-24  Benjamin Kosnik  <bkoz@redhat.com>
 
        * docs/html/20_util/allocator.html: Add bitmap_allocator links.
index eb87680..7ea6fb4 100644 (file)
@@ -108,7 +108,9 @@ namespace __gnu_cxx
       void
       deallocate(pointer __p, size_type __n)
       {
-        pointer __real_p = __p - _M_extra;
+       if (!__p)
+         abort();
+       pointer __real_p = __p - _M_extra;
         if (*reinterpret_cast<size_type*>(__real_p) != __n)
           abort();
         _M_allocator.deallocate(__real_p, __n + _M_extra);
index dc6ae4f..938380c 100644 (file)
@@ -78,7 +78,12 @@ namespace __gnu_cxx
       // about what the return value is when __n == 0.
       pointer
       allocate(size_type __n, const void* = 0)
-      { return static_cast<_Tp*>(malloc(__n * sizeof(_Tp))); }
+      {
+       pointer __ret = static_cast<_Tp*>(malloc(__n * sizeof(_Tp)));
+       if (!__ret)
+         throw std::bad_alloc();
+       return __ret;
+      }
 
       // __p is not permitted to be a null pointer.
       void
@@ -93,7 +98,7 @@ namespace __gnu_cxx
       // 402. wrong new expression in [some_] allocator::construct
       void 
       construct(pointer __p, const _Tp& __val) 
-      { *__p = __val; }
+      { ::new(__p) value_type(__val); }
 
       void 
       destroy(pointer __p) { __p->~_Tp(); }