diff options
author | bkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-03-24 21:40:01 +0000 |
---|---|---|
committer | bkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-03-24 21:40:01 +0000 |
commit | 98e744693bb32e059f2525974f09b35f69b097e5 (patch) | |
tree | 0d0ec11fccc6f462f017f07a58957ab4728af127 /libstdc++-v3/include | |
parent | 1d297472634a3ca5d2f25e9e0bd78c89bc4b9923 (diff) | |
download | gcc-98e744693bb32e059f2525974f09b35f69b097e5.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@79934 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3/include')
-rw-r--r-- | libstdc++-v3/include/ext/debug_allocator.h | 4 | ||||
-rw-r--r-- | libstdc++-v3/include/ext/malloc_allocator.h | 9 |
2 files changed, 10 insertions, 3 deletions
diff --git a/libstdc++-v3/include/ext/debug_allocator.h b/libstdc++-v3/include/ext/debug_allocator.h index eb876803f24..7ea6fb42f98 100644 --- a/libstdc++-v3/include/ext/debug_allocator.h +++ b/libstdc++-v3/include/ext/debug_allocator.h @@ -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); diff --git a/libstdc++-v3/include/ext/malloc_allocator.h b/libstdc++-v3/include/ext/malloc_allocator.h index dc6ae4fb51c..938380c36f6 100644 --- a/libstdc++-v3/include/ext/malloc_allocator.h +++ b/libstdc++-v3/include/ext/malloc_allocator.h @@ -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(); } |