2009-08-11 2 views
5

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

Это правильный код:

class T 
{ 
}; 

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

    return 0; 
} 

Что такое его использование? Является ли ptr действительным? Является ли эта конструкция переносимой?

ответ

8

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

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

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

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

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

0

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

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

2

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

0

Родственный вопрос: What should malloc(0) return?

And from some C99 docs, то таНос (0) поведение определяется реализация:

Ли calloc, таНос и функция Realloc возвращает указатель нулевой или ее указатель на выделенный объект , если запрашиваемый размер равен нулю (7.20.3).

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

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

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

+1

C++ new хорошо определен. – AProgrammer

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