Распределение динамического массива без указания размера правильно сформированного кода? - PullRequest
10 голосов
/ 20 марта 2012

Следующий простой фрагмент программы выдает ошибки компиляции с gcc-4.3.4.

Программа:

int main() 
{   
    char *ptr = new char[10];     
    char *ptr1 = new char[];      
    return 0; 
}  

Ошибки компиляции:

prog.cpp: In function 'int main() ':
prog.cpp: 4: ошибка: ожидаемое первичное выражение перед маркером'] '
prog.cpp: 3: предупреждение: неиспользуемая переменная' ptr '
prog.cpp: 4: предупреждение: неиспользуемая переменная 'ptr1'

Но то же самое компилируется чисто с MSVC без каких-либо диагностических сообщений.

Итак, мой вопрос:
Разрешает ли стандарт вызывать new [] без указания size?Или это ошибка в MSVC?
Может ли кто-нибудь предоставить ссылку из стандарта, которая убедительно скажет, что приведенный выше пример кода неверен или правильно сформирован?


Я посмотрел на:

5.3.4 Новый [expr.new] &
18.4.1.2 Формы массива [lib.new.delete.array]

, но не смог найти каких-либо убедительных доказательств поведения.


РЕДАКТИРОВАТЬ:
Добавление Language Lawyer tag.
Я ожидаю ответа для наблюдаемого поведения, независимо от того, полезно оно или нет, я полностью осознаю, что это не полезно и не рекомендуется.

Ответы [ 2 ]

4 голосов
/ 20 марта 2012

Это не разрешено c ++.

5.3.4. New [expr.new] показывает, что является законным способом вызова new в большом списке, который содержит эту строку:

noptr-new-declarator:
        [ expression ] attribute-specifier-seqopt
        noptr-new-declarator [ constant-expression ] attribute-specifier-seqopt

и позже он объясняет, что может быть константным выражением (в 5.4.3 / 6 и 5.4.3 / 7):

Каждое константное выражение в деклараторе noptr должно быть целочисленным константным выражением (5.19) и иметь строго положительное значение.


После некоторых размышлений следующие пункты должны быть релевантными:

8.3.4 / 1 [dcl.array] , эти части:

В декларации T D, где D имеет вид

    D1 [ constant-expressionopt ] attribute-specifier-seqopt

и тип идентификатора в объявлении T D1 является «производным-описателем типа-списка T», тогда тип идентификатора D является типом массива;

и

если константное выражение опущено, тип идентификатора D - это «массив производных-объявлений-типов-списков с неизвестной границей T», неполный тип объекта.

5.3.4 / 1 говорит:

Этот тип должен быть полным типом объекта, но не абстрактным типом класса или его массивом

Поскольку вы не указали размер массива, тип не завершен, и ваша программа неверна c ++.

4 голосов
/ 20 марта 2012

Это не синтаксически правильно.

Посмотрите на синтаксис для new-expression .

A noptr-new-декларатор должен содержать выражение в квадратных скобках, а выражение должно содержать токен.

...