Должен ли C ++ allocator :: allocate throw или вернуть nullptr в случае неудачного размещения? - PullRequest
0 голосов
/ 14 мая 2018

Концепция Allocator и std :: allocator_traits не говорят, что allocate сделает в случае неудачного размещения - вернет ли он nullptr или throw?

Когда я пишу контейнер, используя стандартный API-распределитель, я должен

  1. Проверить возвращаемое значение и перехватить исключение в функции-члене noexcept версии (например, push_back, resize ...);

  2. Проверьте возвращаемое значение и сгенерируйте, если произойдет сбой, в исключающем вызове

, чтобы независимо от того, выбрасывает ли онили нет, я получу правильное поведение.

1 Ответ

0 голосов
/ 14 мая 2018

Черновик 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, даже если оно будет вполне уместно), если память не может быть выделена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...