Удаляет ли 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;
просто утечка памяти.