2014-10-16 2 views
4

Что делает эта строка кода?Что такое "new int [];" делать?

new int[]; 

Согласно разборке моего компилятора (VC++ 2012), он делает то же самое, как:

new int[0]; 

Но это это определено стандартом C++? И это юридическая инструкция?

+5

Молния не ударяется дважды и все http://stackoverflow.com/questions/1087042/c-new-int0-will-it-allocate-memory – Yann

+1

Звучит как ошибка или расширение. –

+0

AFAIK - это ошибка Visual C++. Существует связанная ошибка, в которой она (в некоторых контекстах) принимает синтаксис 'delete [n] p'. Я сообщил об этом последнему. –

ответ

8

Выражение new int[] недействительно с C++ 11 (я не проверял C++ 14).

С помощью одного [] Синтаксис требует (неявно преобразовать в) интегральный тип выражение между скобками, обозначая нужный размер массива.

Обратите внимание, что этот размер не должен быть постоянным: на нижнем уровне абстракции это то, как вы выделяете динамический массив в C++.


С ++ 11 (через окончательный проект N3290) §5.3.4/6:

Каждый постоянное выражение в noptr-нового-описателя должны (5.19) и оценивают строго положительное значение. выражения в noptr-новом-описателе должно быть целочисленным типа, незаданных перечислимого типа, или типа класса, для которых один без явной функции преобразования в целое или незаданного перечисляемого типа существует (12,3)

выражение использовано для первых [] скобок.В последующих скобках [] необходимо использовать константное выражение (значение, известное во время компиляции), поскольку для адресации самого внешнего размера массива требуются элементы массива определенного размера.


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

+0

Или, может быть, 'std :: dynarray' или' std :: valarray', которые оба являются удивительными смежными контейнерами. – Yakk

+0

@Yakk: Ну нет 'std :: dynarray'. Существует' std :: valarray', но он очень мало используется. По сообщениям, дизайн был неполным, но все же он каким-то образом нашел свой путь int C++ 98. –

7
new int[]; 

не является юридическим.

Согласно проекту стандарта n3337 § 5.3.4, [] должен иметь выражение для первого измерения, а постоянное выражение для каждого последующего измерения (если таковые имеются), как продиктовано грамматике:

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

Здесь каждый постоянного выражения должна быть преобразован постоянным выражением, как указано в пункте 6:

Каждый постоянное выражение в noptr-нового-описателя должен быть конвертированы постоянное выражение (5.19) типа Std :: size_t и должны вычисляться строго положительное значение. Выражение в noptr-new-declarator неявно преобразован в std :: size_t.

+0

И стандартная цитата где? – ThomasMcLeod

+0

Это не должно быть постоянным выражением. Возможно, более актуальной является спецификация грамматики для * noptr-new-declarator *, требующая выражения внутри '[]'. –

+1

** - 1 ** «должно иметь постоянное выражение» неверно. Который может понять, просто * отражая * немного. Например, в течение 1 секунды или около того. –