Что делает / означает распределение массива нулевого размера? - PullRequest
5 голосов
/ 11 августа 2009

Рассмотрим пример кода и натолкнемся на массив с нулевым размером Я создал следующий фрагмент кода, чтобы уточнить мой вопрос

Это действительный код:

class T
{
};

int main(void)
{
  T * ptr = new T[0];

  return 0;
}

Для чего он нужен? Является ли ptr действительным? Эта конструкция переносная?

Ответы [ 4 ]

8 голосов
/ 11 августа 2009

5.3.4 в стандарте C ++:

6 Каждое выражение-константы в direct-new-объявителе должно быть целым выражением-константой (5.19) и иметь строго положительное значение. Выражение в директиве прямого нового объявления должно иметь целочисленный тип или тип перечисления (3.9.1) с неотрицательным значением ...

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

Итак, ваш код выделяет массив, который ведет себя во всех отношениях, как и любой другой массив T (может быть удален с помощью delete [], передан в качестве параметра, возможно, для других целей). Однако он не имеет доступных индексов (то есть чтение или запись ptr [0] приводит к неопределенному поведению).

В этом контексте разница между константным выражением и выражением заключается не в том, является ли фактическое выражение постоянной времени компиляции (что, очевидно, равно 0), а в том, указывает ли оно «последнее» измерение многомерного массива. Синтаксис определен в 5.3.4: 1.

2 голосов
/ 11 августа 2009

Разрешено (5.3.4 / 6). Его результат - пустой массив, поэтому возвращаемое значение - указатель за массивом.

0 голосов
/ 11 августа 2009

Смежный вопрос: Что должен вернуть malloc (0)?

А из некоторых документов C99 поведение malloc (0) определяется реализацией:

Будь то calloc, malloc и функции realloc возвращают ноль указатель или указатель на выделенный объект, когда запрошенный размер равен нулю (7.20.3).

Либо нулевой указатель, либо уникальный указатель, который можно передать в free () возвращается.

См. Справочную страницу malloc (3C).

Конечно, вы спрашиваете о C ++, но информация о malloc, вероятно, в любом случае полезна.

0 голосов
/ 11 августа 2009

Да, это допустимое поведение, и ptr будет действительным. Конструкция является переносимой для всех компиляторов C ++, которые придерживаются стандарта C ++. Это полезно тем, что позволяет вам писать код, который не требует специального случая, чтобы обработать случай, когда количество элементов равно нулю.

Однако, как всегда, вам будет лучше использовать std :: vector (который также может быть нулевого размера) вместо массива.

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