Draft n4659 for C++ standard says at 23.10.9 The default allocator [default.allocator] (emphasize mine):
23.10.9.1 allocator members [allocator.members]
...
T* allocate(size_t n);
2 Returns: A pointer to the initial element of an array of storage of size n * sizeof(T), aligned
appropriately for objects of type T.
3 Remarks: the storage is obtained by calling ::operator new (21.6.2), but it is unspecified when or
how often this function is called.
4 Throws: bad_alloc if the storage cannot be obtained.
It makes it clear that the standard allocator will raise a bad_alloc
exception if it cannot allocate storage.
Above is for the standard allocator. The requirement for any allocator are described in 20.5.3.5 Allocator requirements [allocator.requirements] and table 31 — Allocator requirements contains:
a.allocate(n) [Return type:] X::pointer [Assertion/note/
pre-/post-condition]Memory is allocated for n
objects of type T but objects are
not constructed. allocate may
throw an appropriate
exception
My understanding is that allocate
can return only when memory has been allocated. So the allocator should throw an appropriate exception (not necessarily bad_alloc
even if it would be quite appropriate) if memory could not be allocated.
std::bad_alloc
to report that allocating has failed. Also note that thepush_back
andresize
functions of standard containers are usually NOTnoexcept
. – Bogernullptr
return value... – Stesha