Черновик n4659 для стандарта C ++ гласит 23.10.9 Распределитель по умолчанию [default.allocator] (подчеркните мой):
23.10.9.1 члены-распределители [allocator.members]
...
T* allocate(size_t n);
2 Возвращает: указатель на начальный элемент массива хранения размером n * sizeof (T), выровненный
соответственно для объектов типа T.
3 Примечания: хранилище получается с помощью вызова оператора :: new (21.6.2), но оно не указано, когда или
как часто эта функция вызывается.
4 Броски: bad_alloc, если хранилище не может быть получено.
Поясняется, что стандартный распределитель вызовет исключение bad_alloc
, если не сможет выделить хранилище.
Выше для стандартного распределителя. Требования к любому распределителю описаны в 20.5.3.5 Требования к распределителю [allocator.requirements], а таблица 31 - Требования к распределителю содержит:
a.allocate (n) [Тип возвращаемого значения:] X :: pointer [Утверждение / примечание /
до- / постусловие] Память выделена для
объекты типа T, но объекты
не построен. выделить май
бросить соответствующий
исключение
Насколько я понимаю, allocate
может вернуться только после выделения памяти. Поэтому распределитель должен выдавать соответствующее исключение (не обязательно bad_alloc
, даже если оно будет вполне уместно), если память не может быть выделена.