malloc_allocator.h: Fixed the construct function to call global placement new instead of assignment.

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
This commit is contained in:
Dhruv Matani 2004-03-24 21:40:01 +00:00 committed by Benjamin Kosnik
parent 8367b9c1e9
commit 58c959212f
3 changed files with 19 additions and 3 deletions

View 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.

View 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);

View 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(); }