2013-07-04 2 views
-1

У меня есть следующий случай.delete vs delete []

int *arrayP=new int[4]; 
arrayP[0]=0;arrayP[1]=1;arrayP[2]=2;arrayP[3]=3; 
int *temp; 
cout<<arrayP[0]<<endl; 
temp=arrayP; 
++arrayP; 
cout<<arrayP[0]; 
cout<<arrayP[1]; 
delete temp; 
cout<<arrayP[0]; 

Выход

0 
1 
2 
-1212222 

Почему это так? arrayP указывает на первый элемент в массиве размера 4. Таким образом, temp также указывает на первый элемент Теперь, почему удаление временного топика, т.е. первого элемента, также удаляет целое целое число array.arrayP хранит адрес следующего элемента массива и, следовательно, массив не является сиротой (я предполагаю, что он удалил целочисленный массив, поскольку arrayP [0] показывает значение мусора.)

Если это так (то есть удаление temp удалит весь целочисленный массив), то что разница между delete [] и delete.

+3

Теперь, когда вы удаляете темп, находящийся на первом месте. Вы не можете использовать 'delete' то, что вы не выделили с помощью' new'. Если вы используете 'new []', вы должны использовать 'delete []'. Как только вы нарушите это правило, все перестает иметь смысл. Тем не менее, почему кто-нибудь будет использовать 'new []': | –

+0

Ok.So предположим, что моему коду больше не нужен первый элемент массива, нет свободного места для этого пространства. (Я хочу, чтобы не копировать его в более короткий массив, поскольку он занимает время и, очевидно, список ссылок) – user2511713

+0

Если это не нуждается в первом элементе массива, но нуждается в других, а затем просто не ссылается на него; тебя действительно волнует? – Bathsheba

ответ

8

Если вы используете new[], вы должны сбалансировать его с помощью delete[].

Если вы используете new, вы должны сбалансировать его с помощью delete.

Смешивание их приведет к утечкам памяти/сбоям программы (технически не определено поведение). (В вашем примере C++ записывает внутренне, что вы создали 4 int s, а вызов delete[] позволяет C++ получить доступ к этой записи. Вызов delete нет).