Заблокирован
1

Зачем нужно освобождать память динамических объектов в деструкторе, если всё равно это сделает менеджер памяти

06.05.2015, 14:16. Показов 3872. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не скажу за все ОС-и, но под Windows есть менеджер памяти. Когда по ходу кода встречается new, ну или что - то другое для алокации динамической памяти из кучи, менеджер памяти всё это дело конечно же отследит и при закрытие процесса он всю это память корректно освободит.

Вопрос, зачем для объектов, созданных посредствам new, следует вызывать delete в деструкторе, если за вас это сделает менеджер памяти ОС ?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.05.2015, 14:16
Ответы с готовыми решениями:

Зачем использовать delete в небольшой программе, если после закрытия память все равно освободится?
Можно ли использовать new без delete, если программка небольшая, а также если нет класса вообще...

Какую память освобождать в деструкторе?
Если я вызываю деконструктор класса, допустим чтобы освободить динамическую память, выделенную с...

Как правильно освобождать память в динамических структурах
Использую деструктор для освобождения памяти от указателя на начало списка. struct Node { int...

Как корректно освобождать память (удалять) объектов GDI+?
Ну собственно вопрос в шапке. Например есть Image *img; Как его правильно удалить, чтоб избежать...

7
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
06.05.2015, 14:26 2
Да-да-да. Ты и в самом деле никогда не слыхал о программах, постоянно динамически создающих тысячи и тысячи этих самых "объектов" и работающих в режиме 365х7х24 (365 дней в году, 7 дней в неделю, 24 часа в сутки)?
0
1371 / 594 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
06.05.2015, 14:29 3
Ты начал учить не с самого главного. Зачем по твоему return 0 нужен?
Неужели думаешь, что в 100% из множества случаев в течении долгих лет любая программа всегда завершится корректно?
0
Заблокирован
06.05.2015, 15:32  [ТС] 4
Цитата Сообщение от CheshireCat Посмотреть сообщение
Ты и в самом деле никогда не слыхал о программах, постоянно динамически создающих тысячи
Слышал и делал. Я вероятно не так вопрос сформулировал.
Вопрос собственно заключался в том, есть ли резон удалять все динамический созданные объекты процесса перед его закрытием?

Цитата Сообщение от daslex Посмотреть сообщение
Зачем по твоему return 0 нужен?
Что бы вернуть ноль.
Цитата Сообщение от daslex Посмотреть сообщение
Неужели думаешь, что в 100% из множества случаев в течении долгих лет любая программа всегда завершится корректно?
Не думаю.
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
06.05.2015, 16:26 5
Цитата Сообщение от newbie777 Посмотреть сообщение
Вопрос собственно заключался в том, есть ли резон удалять все динамический созданные объекты процесса перед его закрытием?
Нннуууу..... Строго говоря, да, когда процесс завершается, его адресное пространство освобождается. Но:
- во-первых, с моей точки зрения, хороший тон в программировании предписывает соблюдение принципа "нагадил - убери за собой!",
- во-вторых, объекты могут "держать" не только память, но и какие-нибудь ограниченные ресурсы,
- в-третьих, а кто может дать гарантию, что твой код никогда больше не будет дорабатываться или масштабироваться другим программистом? Если пишешь исключительно для себя, любимого, то можно. А в промышленном программировании сплошь и рядом бывает, что код дорабатывается и изменяется другими программистами, иногда через годы после написания его автором.

Ну и так далее.... К тому же, в современном C++ использование RAII позволяет вообще забыть о "ручном" управлении new/delete. Я уж и не помню, когда мне приходилось лечить утечки памяти, - лет этак восемь-десять назад, подчищая код, доставшийся мне в наследство от других программистов....
1
Заблокирован
06.05.2015, 16:58  [ТС] 6
Цитата Сообщение от CheshireCat Посмотреть сообщение
К тому же, в современном C++ использование RAII позволяет вообще забыть о "ручном" управлении new/delete.
Не, ну что значит забыть или не забыть. Любая более менее серьёзная программа вдоль и поперёк усеяна указателями и лично они у меня повсюду участвуют в бизнес логике, даже не представляю, как можно без ручного управления памятью хоть что - то написать, так, разве что хелоу ролд на смартпоинтерах.
У меня везде указатели летают между потоками, идут проверки на нули (при удаления nullptr присваиваю) и тд, как без указателей вообще грамотно синхронизировать данные в потоках .... (особенно если ты придерживаешься парадигмы non blocking или event driven программирования )

P.S.: я не новичок, несмотря на ник, мне просто в данной теме было интересно, во всех ли ОСях менеджер памяти корректно почистит за тобой ...
0
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
06.05.2015, 18:34 7
Лучший ответ Сообщение было отмечено newbie777 как решение

Решение

Цитата Сообщение от newbie777 Посмотреть сообщение
во всех ли ОСях менеджер памяти корректно почистит за тобой ...
Даже в винде существуют Common области памяти которые вообще ни за каким процессом не числятся. Мало того если распределение было в Common области которая числится не за твоим процессом то оно там и останется. А так да - у всех осей (во всяком случае у тех с которыми имел дело, даже Siemens R-300-16 70-ых годов) обычно блоки памяти числится за процессом (у многих еще и открытые файлы и т.п.), и по завершении процесса все освобождается/закрывается. Опять же распределение памяти через New и менеджер памяти оси пересекаются мало и далеко не во всех осях/менеджерах/режимах менеджера процесса. Обычно менеджер кучи процесса отгрызает кучу блоками через вызовы менеджера ОС, а за выделением/освобождением внутри блоков следит сам. А то накладные расходы не ве....ться в поворот. Даже под доской память средствами ОС распределялась параграфами по 16 байт причем на каждый блок дескриптор в параграф, соответственно есть смысл брать память у оси кусками побольше. Ну и если в дескрипторе переписать ProcessId 0 он вообще не удалится.
1
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
12.05.2015, 18:25 8
Цитата Сообщение от CheshireCat Посмотреть сообщение
Я уж и не помню, когда мне приходилось лечить утечки памяти, - лет этак восемь-десять назад, подчищая код, доставшийся мне в наследство от других программистов....
На С++ то же не помню. Хотя пользую ручное управление памятью. А вот на паскале... не далее чем неделю назад со всеми этими смарт-поинтерами утечка и полезла. переделал с дельфовских class котоые со смарт-поинтерами на object которые с ручным управлением - и проблема исчезла как ее и не было.
0
12.05.2015, 18:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.05.2015, 18:25
Помогаю со студенческими работами здесь

Зачем биты нужны это меньше байтов но int 32 бита но я не допер зачем это нужно это 4 байта то есть int не может больше 4 байт весить?
Вот еще один вопрос зачем биты нужны это меньше байтов но int 32 бита но я не допер зачем это...

Код по Бутстрапу, зачем нужна эта кнопка (button) в навигации, если ее все равно невидно
<nav class="nav navbar-default"> <div class="container"> <div class="row"> ...

Нужно ли освобождать память перед повторым выделением?
к примеру мы имеем: char *itsString = new char; delete itsString; char *itsString = new char;...

Нужно ли освобождать память после Socket.SendStream?
mm:=TMemoryStream.Create; mm.LoadFromFile(mess); Socket.SendStream(mm); После этих...

Библиотека STL, нужно ли освобождать память после использования контейнеров?
Когда я использую vector, list, и т.д. мне нужно потом освобождать память или оно само очищается?

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru