2012-03-20 2 views
1
char * a = new char[]; 
a[0]='1'; 
delete []a; 

Я не указал размер массива, но когда я его запустил, он дал ошибку отладки. Но когда я пишу этот код следующим образом:Удалить массив типа char

char * a = new char[1]; 
a[0]='1'; 
delete []a; 

тогда все будет в порядке.

Может ли любое тело сказать мне, почему оно будет работать правильно, когда я укажу номер?

+5

При распределении памяти вам нужно указать, сколько выделяется. Я был бы удивлен, если бы первый не дал ошибку или хотя бы предупреждение при компиляции. –

+0

@Joachim: MSVC принимает синтаксис без какой-либо диагностики! Я очень удивлен. –

ответ

3

char * a = new char[];

не выделяет какую-либо памяти. Его даже не действительное утверждение и должно приводить к ошибке или предупреждению по крайней мере.

char * a = new char[1];

делает для одного символа, и именно поэтому вы можете использовать и удалить его. Для нового ключевого слова требуется объем памяти.

+0

Я думаю, что 'char * a = new char [];' даже не допустимый оператор, не говоря уже о возможности выделения памяти –

+0

@ another.anon.coward- Я согласен. Обновлено. – vidit

+0

Спасибо за обновление! Как указано в комментариях, MSVC принимает его, хотя g ++ генерирует ошибку времени компиляции –

1

При использовании нового ключевого слова вы указываете, сколько памяти вы хотите зарезервировать.

Например, когда вы говорите char *a = new char[1];, вы говорите, что вам нужен массив, который может содержать 1 символ.

В первом заявлении, которое вы опубликовали, вы не резервируете память, и именно поэтому ваша программа рушится.

0

char * a = new char[];

Вы должны сказать, сколько памяти будет выделено, что должно быть сделано в течение []

Однако для удаления не нужно указать размер массива, система времени выполнения знает размер массива указываемого указателем a

delete []a;

Но не забудьте положить [] для удаления т он массив.

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