Нужно ли удалять динамически созданные объекты после завершения программы C++?

Хотел узнать - всегда ли компилятор/ОС очищает память, выданную из кучи с помощью оператора new, после исполнения программы, или же это нужно сделать вручную с помощью операторов delete?


Ответы (3 шт):

Автор решения: HolyBlackCat

всегда ли компилятор/ОС очищает память

Да. Возможно на каких-то древних ОС это не так, но я с такими не сталкивался.

или же это нужно сделать вручную

Нет.

→ Ссылка
Автор решения: KoVadim

Компилятор не удаляет сам (не добавляет вызовов деструктора в код) для объектов, которые созданы просто через new. Да, в 99% случаев память будет возвращена системе, но деструкторы вызваны не будут. Если на это закладывается какая то логика, то ой-ой.

Крайне желательно явно освобождать все, что было выделено явно через new/malloc. Если объект выделяет какие то особые ресурсы операционной системы, то она может не освобождать их. А вот файловые дескрипторы будут закрыты ОС. Но вот если это ostream, то нет никаких гарантий, что его внутренние буфера будут сброшены перед закрытием файлового дескриптора и могут быть утеряны данные.

→ Ссылка
Автор решения: Тарас Атавин

Всё надо аккуратно освобождать. Да, система освободит память, когда потеряет записи о том, что она была выделена. Но это просто манипуляции с дескрипторами страниц, при этом не вызываются деструкторы и не выполняются никакие действия, которые должны были быть выполнены самой софтиной при освобождении памяти. Просто забыли, что память была выделена, из-за чего снова можем её выделять. И не более того. Вы точно знаете, что экзел не из-за этого при своём штатном закрытии просит сообщить о своём падении в мелкософт? Разводить глюки – плохая идея, разводить призраки глюков – идея ещё хуже. Одно дело закрывать дебажную версию софтины в середине теста, не дожидаясь аккуратного освобождения, или не доходить до освобождения из-за глюков, а совсем другое – бросать указатели без присмотра и ждать, что система подотрёт Вам нос. Она-то подотрёт, разведя сопли уже у пользователя, чьи знания Вашего кода заведомо меньше Ваших. Мало ли какие записи в файлы, в ключи реестра, в разделяемую память... были запланированы в деструкторах? В том числе, в Ваших собственных. Система, даже если сбросит буфера, об этих записях не догадается всё равно. И носы программистам система подтирает только для того, чтоб память не текла при выходе на три кнопки и при тестировании в процессе разработки. А не для того, чтоб на аварийное освобождение полагались в релизе.

→ Ссылка