2015-11-17 6 views
7

я читал проект стандарта N3337 и сноска 79 (§ 5.3.7 страница 110) государства (курсив мой ):Что такое массив нулевой длины, упомянутый в проекте стандарта?

79), не нулевой длины массивов, это то же самое, как указатель на первый элемент массива, созданный этим новым выражением. нулевой длины массивы не первый элемент

Я был под впечатлением, что C++ не поддерживает нулевой длины массивов.

+1

Вы не можете много сделать с ними. Насколько я знаю, это, по сути, позволить новым реализовать в плане malloc. –

ответ

4

Насколько я понимаю, это означает, что новые могут быть реализованы в терминах malloc, который позволяет запрашивать нулевые запросы. Вы не можете много сделать с ними, поскольку, как отмечено в цитате ниже, разыменование такого указателя является неопределенным поведением.

Мы можем найти обоснование в проекте C++ стандарта сноске 35, на которую ссылается из раздела 3.7.4.1[basic.stc.dynamic.allocation]:

[...] Даже если размер запрошенное пространство равно нулю, запрос может выйти из строя. Если запрос завершен, возвращаемое значение должно быть значением ненулевого указателя (4.10) p0, отличным от любого возвращаемого значения p1 , если только это значение p1 не было передано оператору delete. Эффект разыменования указателя, возвращаемый как запрос на нулевой размер, не определен.

и сноска 35 говорят:

Цель состоит в том, чтобы оператор нового() осуществимый, вызвав зЬй :: таНоса() или зЬй :: calloc(), поэтому правила в основном . C++ отличается от C, требуя нулевого запроса, чтобы вернуть ненулевой указатель.

Из проекта C11 стандартные секции 7.22.3 функции управления памятью:

[...] Если размер запрошенное пространство равно нулю, поведение определяется реализацией: возвращается нулевой указатель или поведение такое, как если бы размер был некотором ненулевым значением, за исключением того, что возвращаемый указатель не использовался для доступа к объекту.

6

В то время как нулевой длины массивов, как

int arr[0]; 

не являются стандартными C++, динамические массивы нулевой длины как

int *arr = new int[0]; 

законны и то, что ваша цитата имеет в виду также:

Когда значение выражения в noptr-new-declarator равно нулю, функция распределения вызывается в выделяет массив без элементов.

5.3.4 (7) in N3337.

Смежные вопросы