Удаляет ли delete[] освобождает весь блок памяти?
рассмотрим следующее:
char* msg = new char[20];
msg[4] = '';
delete[] msg;
- сделал
delete[] msgосвободить все 20 символов, выделенных дляmsgили только те, кто до? - если он освобожден только
, как я могу заставить его удалить весь блок памяти?
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;
просто утечка памяти.