Зачем удалять динамические массивы, и что будет если их не удалять?

94
26 мая 2021, 08:50

нам в универе сказали, что мы обязаны постоянно удалять массивы, если они динамические, но я так и не понял зачем и почему. Вот, например, код на С++ с динамическим выделением памяти для массива arr:

void main(){
      int size = 10;
      int *arr = new int[size];
}

Почему я должен его удалять, какие ошибки в дальнейшем будут, если я буду постоянно использовать вот этот arr?

Answer 1

Представьте себе городскую систему проката автомобилей. Не очень большую. Вы постоянно берете автомобили напрокат, пользуетесь и не сдаете, но и сами больше не ездите. Постепенно все автомобили будут исчерпаны, ездить будет не на чем. Это аналог просто не удаления (освобождения) памяти.

Вы попользовались, выбросили ключи и все бумаги и даже не знаете, где теперь этот автомобиль. Это - потерянная память (утечка). Вы бы и рады ее вернуть, чтоб было на чем проехать - но не можете этого сделать. Это - если вы затерли (переписали, кончилось время жизни) все указатели на выделенную память. (Правда, в системах со сборкой мусора время от времени - обычно, когда машины заканчиваются - специальная служба занимается тем, что объезжает город в поисках заброшенных автомобилей и возвращает их в прокат.)

Вы вернули автомобиль, но сделали себе копию ключа. Если вы попробуете им воспользоваться - это уже будет кража, и приедет полиция. А может, и не приедет, если никто не заметит... Undefined behaviour! :) Это - попытка получить доступ по указателю на освобожденную память.

Вы сделали красивые копии документов и, пользуясь тем, что при возврате автомобиля возвращают залог, хотите сдать его еще раз. Это - попытка повторного освобождения памяти. Опять же - это воровство, и приедет полиция. Скорее всего. А может, и прокатит... Undefined behaviour, что вы хотите...

Вы пытаетесь сдать в прокат собственный автомобиль (ну, может, залог в прокате такой большой? :)) Это - попытка освобождения памяти, не выделенной менеджером памяти, например, попытка освободить память, выделенную под переменную в стеке. И опять же - это воровство со всеми вытекающими последствиями...

Примерно так...

P.S. Да, автомобили бывают и особо интеллектуальные, которые сами берут в той же системе напрокат, например, колеса или там прицепы, и пока вы не сдадите такой автомобиль - колеса тоже будут не сданы. Это к конструкторам/деструкторам динамически выделяемых объектов.

P.P.S. Когда вы уезжаете из города, он разрушается вместе с прокатом, так что сдали вы автомобили или не сдали - уже не имеет значения... Это к тому, что по завершению программы не так уж важно, оставалась ли не освобожденная память. Но, если у вас выработается из-за этого плохая привычка не сдавать машины вовремя, в новом городе у вас могут быть проблемы...

READ ALSO
C++, dynamic_cast и уточнение интерфейса

C++, dynamic_cast и уточнение интерфейса

Я уже долго пытаюсь придумать, как можно организовать игровую механику классического WormsМне удалось найти разные варианты, но все они со своими...

111
Ошибка при добавлении rc файлов Qt

Ошибка при добавлении rc файлов Qt

Проект был без ошибок, пока не добавила иконку приложение qt

100
Масштабирование текста на ноутбуке

Масштабирование текста на ноутбуке

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

90
Наследование событий (events) в qt

Наследование событий (events) в qt

Есть главное окно QMainWindow

100