Удаляет ли delete[] освобождает весь блок памяти?

рассмотрим следующее:

char* msg = new char[20]; 
msg[4] = ''; 
delete[] msg; 
  1. сделал delete[] msg освободить все 20 символов, выделенных для msg или только те, кто до ?
  2. если он освобожден только , как я могу заставить его удалить весь блок памяти?

3 ответов


исходный код в вашем вопросе имел неопределенное поведение, так как вы использовали delete С new[].

я заметил, что вы исправили путем замены delete С delete[]:

delete[] msg;

это правильно, и будет освобождать всю память, которая была выделена на new[].

нет понятия "удаление до "или любое другое такое" частичное " исключение. Только полное блоки, выделенные с new/new[] может быть удалены, так что ваш код нормально.


на delete[] оператор удаляет весь блок памяти. Вы не можете освободить часть блока памяти – вы можете освободить только весь блок.

Это также относится к new/delete и malloc/free. Функция освобождения может освободить только весь блок памяти.


вы должны использовать delete[] бесплатные массив. Это единственный способ, которым вы можете сказать программе искать информацию о массиве и иметь возможность освободить весь массив.

нормальный delete компилятор может подумать, что вы хотите освободить только один указатель, и это не так. Дополнительная информация о размере массива и все, что не будет искать, и дополнительная память не будет освобождена.

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

Class *array = new Class[50];
array[0] = NULL;
delete[] array;

просто утечка памяти.