Выделение нулевых объектов с помощью allocate (0) в C ++ - PullRequest
0 голосов
/ 04 декабря 2018

new int [0] разрешен в C ++, но хорошо ли определена std :: allocator (). Allocate (0)?В более общем смысле, должны ли все распределители принимать 0 в качестве параметра для выделения?

Редактировать: после прочтения ответов, которые я тестировал, Visual Studios std :: allocator:

allocate (0) дает nullptr

deallocate (nullptr, что угодно) является nop.

Так что использование nullptr является хорошим предложением, но стандарт не требует, чтобы deallocate (nullptr, 0) был nop, см. C ++ allocator:: освобождение (NULL, 1) разрешено?

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Таблица 34 - Требования к Cpp17Allocator
Память выделена для n объектов типа T, но объекты не построены.allocate может выдать соответствующее исключение.174 [Примечание: если n == 0, возвращаемое значение не указано.- конец примечания]

Я бы прочитал это как "Распределитель должен / должен обрабатывать n == 0, а не бросать и возвращать значение, которое может быть действительным указателем или nullptr."

0 голосов
/ 04 декабря 2018

Действительно new int[0] четко определено.Обратите внимание, что вы должны вызвать delete[] для возвращенного указателя, и поведение при разыменовании указателя не определено.

Аналогичные правила применяются к std::allocator().allocate(0): вы не можете разыменовать возвращенный указатель, и вынеобходимо очистить память обычным способом, вызвав std::allocator::deallocate.

Распределителю разрешено генерировать исключение std::bad_alloc;выполняя это, вы можете справиться со случаем с 0 параметрами, не нарушая при этом требований, установленных стандартом.Возвращение nullptr является альтернативой.

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