Re: Нужно ли делать delete-ы в конце приложения?
От: SergeyT. США http://sergeyteplyakov.blogspot.com/
Дата: 30.11.09 13:35
Оценка: +1
Здравствуйте, SoulKeeper, Вы писали:

SK>Объясните мне пожалуйста, что действительно delete делать не стоит? А если у меня небольшое приложение, которое недолго работает, так вообще ни одного delete для выделенной памяти не нужно?

SK>Чувствую себя опплеванным дураком, а возразить то вроде и нечего.

Если речь все же идет о сингтонах, то можно посмотреть на Loki::Singleton (это библиотека от Андрея Александреску), там процесс управления временем жизни отдан на откуп отдельной стратегии, в результате чего можно изменив одну строку кода изменить поведение синглтона, произвольно добавляя или удаляя вызовы деструктора в момент закрытия приложения.

//деструктор будет вызван в момент закрытия приложения
typedef Loki::SingletonHolder<
      Log,
      Loki::CreateUsingNew,
      Loki::DefaultLifetime,
      Loki::ClassLevelLockable> globalLog;

//деструктор не будет вызван вовсе
typedef Loki::SingletonHolder<
      Log,
      Loki::CreateUsingNew,
      Loki::NoDestroy,
      Loki::ClassLevelLockable> globalLog;


З.Ы. а вообще, в ветке верно говорили, что нужно почитать о том, что такое RAII и почему плохо руками вызывать delete. Смотреть книги Мейерса, Страуструпа, Саттера (цикл статей Саттера о безопасности исключений очень быстро отбивает всякую охоту в ручном управлении ресурсами).
Re[4]: Нужно ли делать delete-ы в конце приложения?
От: SoulKeeper  
Дата: 30.11.09 13:35
Оценка:
Здравствуйте, SaZ, Вы писали:

SaZ>Если был new double — то delete тоже нужен. Но вот вызов delete при atexit (как выше было написано)- спорный вариант.


Да дело не в atexit, он вообще сказал, что очищать любые объекты перед выходом — бред, по типу даже если это delete [] my_numbers; в деструкторе глобального класса (который уничтожается вместе с приложением).
И насколько я понял, получается он прав, ведь этот массив double* numbers все равно будет освобожден как и вся куча. Или я неправильно понял?
Re[7]: Нужно ли делать delete-ы в конце приложения?
От: SergeyT. США http://sergeyteplyakov.blogspot.com/
Дата: 30.11.09 13:36
Оценка:
Здравствуйте, igna, Вы писали:


SH>>- освобождение памяти на этом этапе и правда бессмысленно. Пожалуй тут согласен с начальником. Хотя оно и никому не мешает.


I>К fclose эти рассуждения тоже относятся?


Не относится, т.к. по закрытию приложения все handle-ы будут освобождены. Но это не относится, например, к именованным мьютексам.
Re[7]: Нужно ли делать delete-ы в конце приложения?
От: SergH Россия  
Дата: 30.11.09 13:38
Оценка: +1
Здравствуйте, igna, Вы писали:

SH>>- освобождение памяти на этом этапе и правда бессмысленно. Пожалуй тут согласен с начальником. Хотя оно и никому не мешает.


I>К fclose эти рассуждения тоже относятся?


Я же специально написал и даже курсивом не поленился выделить, что это относится к освобождению памяти.
Все остальные случаи нужно рассматривать подробно и отдельно, сразу про всё не сказать.

С fclose этот номер может не пройти, если fwrite и прочие буферизирует вывод. Тогда часть данных может остаться в буфере. Если же не буферизирует, [любая вменяемая] ОС закроет файл сама и всё будет нормально. На такие вещи, конечно, лучше не полагаться.
Делай что должно, и будь что будет
Re[6]: Нужно ли делать delete-ы в конце приложения?
От: SoulKeeper  
Дата: 30.11.09 13:47
Оценка:
Здравствуйте, SergH, Вы писали:

SH>Это я просто неправильно понял твою ситуацию. Когда ты написал про delete в деструкторе, я предположил следующее:


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

SH>Хотя в конце, конечно, тоже всё освободится, но это может оказаться немного поздно.


Но ведь по его мнению все равно освободится

Остался последний вопрос а как умудряются завершенные процессы (например, некоторые игры) отъесть "безвозвратно" часть памяти, если все равно вся память (heap) по завершению освобождается, за исключением разделяемых разными процессами переменных?
Re[2]: Нужно ли делать delete-ы в конце приложения?
От: SoulKeeper  
Дата: 30.11.09 13:54
Оценка:
Здравствуйте, SergeyT., Вы писали:

ST>З.Ы. а вообще, в ветке верно говорили, что нужно почитать о том, что такое RAII и почему плохо руками вызывать delete. Смотреть книги Мейерса, Страуструпа, Саттера (цикл статей Саттера о безопасности исключений очень быстро отбивает всякую охоту в ручном управлении ресурсами).


Да, спасибо обязательно почитаю про RAII и smart pointer.
Re[7]: Нужно ли делать delete-ы в конце приложения?
От: SergH Россия  
Дата: 30.11.09 14:01
Оценка: +1
Здравствуйте, SoulKeeper, Вы писали:

SK>Но ведь по его мнению все равно освободится


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

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

SK>Остался последний вопрос а как умудряются завершенные процессы (например, некоторые игры) отъесть "безвозвратно" часть памяти, если все равно вся память (heap) по завершению освобождается, за исключением разделяемых разными процессами переменных?


На уровне С++ ответа на этот вопрос нет. Какие-то системно-зависимые вещи, которые ОС почему-то не может почистить за процессом. В зависимости от ситуации, скорее всего можно рассматривать как баг в ОС. По идее отдельный процесс не должен быть способен таким образом повлиять на всю систему.
Делай что должно, и будь что будет
Re: Нужно ли делать delete-ы в конце приложения?
От: IT Россия linq2db.com
Дата: 30.11.09 15:19
Оценка: +1
Здравствуйте, SoulKeeper, Вы писали:

SK>Чувствую себя опплеванным дураком, а возразить то вроде и нечего.


Это же элементарные средства гигиены.
Если нам не помогут, то мы тоже никого не пощадим.
Re[5]: Нужно ли делать delete-ы в конце приложения?
От: wander  
Дата: 30.11.09 22:28
Оценка:
Здравствуйте, SoulKeeper, Вы писали:

SK>Здравствуйте, SaZ, Вы писали:


SaZ>>Если был new double — то delete тоже нужен. Но вот вызов delete при atexit (как выше было написано)- спорный вариант.


SK>И насколько я понял, получается он прав, ведь этот массив double* numbers все равно будет освобожден как и вся куча. Или я неправильно понял?


Возможна такая система, которая не будет подчищать память за приложением.
Re[3]: Нужно ли делать delete-ы в конце приложения?
От: alexeiz  
Дата: 01.12.09 00:39
Оценка:
Здравствуйте, SoulKeeper, Вы писали:

SK>Спасибо, это понял. А если не объект удаляется , а, например, массив чисел, то delete в принципе не обязательно? Как то странно все это, меня учили, что если есть new, то должен быть delete, а тут до меня докапываются, что я зря написал их


Тебе лучше всё-таки писать delete там, где надо, потому что для тебя это на уровне правил, которые ты ещё не понимаешь.
Re[5]: Нужно ли делать delete-ы в конце приложения?
От: CreatorCray  
Дата: 01.12.09 11:20
Оценка: +3 -1 :))) :)))
Здравствуйте, SoulKeeper, Вы писали:

SK>Да дело не в atexit, он вообще сказал, что очищать любые объекты перед выходом — бред, по типу даже если это delete [] my_numbers; в деструкторе глобального класса (который уничтожается вместе с приложением).

Де факто ОС конечно подотрёт за нагадившим, но я б такого разработчика жестоко бил по голове железной палкой, ибо такой код содержит грубейшую ошибку управления ресурсами и потому не реюзабелен.
И если вдруг в какой то момент этот класс перестанет быть глобальным то на ровном месте получим "полну жопу огурцов". И все только потому, что какому то лентяю было впадлу прибрать за собой.
Так что не слушай дебилов, а еще лучше смени работу. Потому как такие тараканы обычно не водятся поодиночке, и есть риск что из головы начальства скоро попрёт вша красная, вша жОлтая и еще более суровые усеницы.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: Нужно ли делать delete-ы в конце приложения?
От: SaZ  
Дата: 01.12.09 11:58
Оценка: +3
Здравствуйте, SoulKeeper, Вы писали:

SK>Здравствуйте, SaZ, Вы писали:


SaZ>>Если был new double — то delete тоже нужен. Но вот вызов delete при atexit (как выше было написано)- спорный вариант.


SK>Да дело не в atexit, он вообще сказал, что очищать любые объекты перед выходом — бред, по типу даже если это delete [] my_numbers; в деструкторе глобального класса (который уничтожается вместе с приложением).

SK>И насколько я понял, получается он прав, ведь этот массив double* numbers все равно будет освобожден как и вся куча. Или я неправильно понял?

Поинтересуйся у начальства, а зачем вообще освобождать память и правильно проектировать приложения?
Re: Нужно ли делать delete-ы в конце приложения?
От: vsb Казахстан  
Дата: 01.12.09 13:04
Оценка:
Здравствуйте, SoulKeeper, Вы писали:

SK>Здравствуйте.

SK>Написал как-то приложение, мой начальник посмотрел и сказал: что у меня за глупость в приложении — в конце приложения стоят операторы delete для выделенной мной памяти операторами new. Ведь она же и так освободится по завершению процесса!

SK>Объясните мне пожалуйста, что действительно delete делать не стоит? А если у меня небольшое приложение, которое недолго работает, так вообще ни одного delete для выделенной памяти не нужно?

SK>Чувствую себя опплеванным дураком, а возразить то вроде и нечего.

Можно использовать идиому вроде

#ifndef NDEBUG
delete ...
#endif

для удаления примитивных типов, например если удаляется реально много объектов, и это удаление занимает, скажем, секунду.
Re: Нужно ли делать delete-ы в конце приложения?
От: andrey.desman  
Дата: 01.12.09 13:43
Оценка:
Здравствуйте, SoulKeeper, Вы писали:

SK>Здравствуйте.

SK>Написал как-то приложение, мой начальник посмотрел и сказал: что у меня за глупость в приложении — в конце приложения стоят операторы delete для выделенной мной памяти операторами new. Ведь она же и так освободится по завершению процесса!

Да ладно, это ж начальник! Ему же надо что-то умное сказать и поучить "молодое поколение". Видимо, больше не нашел к чему придраться
Re[8]: Нужно ли делать delete-ы в конце приложения?
От: IID Россия  
Дата: 01.12.09 18:01
Оценка:
Здравствуйте, SergeyT., Вы писали:

ST>Здравствуйте, igna, Вы писали:



SH>>>- освобождение памяти на этом этапе и правда бессмысленно. Пожалуй тут согласен с начальником. Хотя оно и никому не мешает.


I>>К fclose эти рассуждения тоже относятся?


ST>Не относится, т.к. по закрытию приложения все handle-ы будут освобождены. Но это не относится, например, к именованным мьютексам.


Причём тут мьютексы, да ещё обязательно именованные ? Они ничем от файлов не отличаются в этом плане. Их хендлы точно так же будут закрыты.
kalsarikännit
Re[5]: Нужно ли делать delete-ы в конце приложения?
От: Erop Россия  
Дата: 01.12.09 20:16
Оценка:
Здравствуйте, SoulKeeper, Вы писали:

SK>И насколько я понял, получается он прав, ведь этот массив double* numbers все равно будет освобожден как и вся куча. Или я неправильно понял?


Вообще-говоря, это от окружения программы зависит. В винде или линуксе границы процесса преодолеть не так-то и просто. А вот на какой-нибудь железке вполне возможны варианты...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: Интересно бы послушать и другую сторону...
От: Erop Россия  
Дата: 01.12.09 20:25
Оценка:
Здравствуйте, SoulKeeper, Вы писали:

SK>Чувствую себя опплеванным дураком, а возразить то вроде и нечего.


Слушай, а ты уверен, что верно понял начальника?
Случаи они того, разные бывают...
Не могло быть так, что он поручил тебе написать какую-то нужную программу, а ты, вместо этого, написал самопальный синглетон с delete (double*) в atexit, который и отлаживал пару месяцев?...

Зачем тебе вообще понадобился синглетон с вектором из double?
Чем тебе просто глобальный std::vector<double> не подоёшл? И почему он сенглитон, кстати? Это зачем теюе понадобилось?

Шнфа твоего мы тут выслушать не можем, может ты расскажешь подробнее про свою задачу?
А то вдруг правда тебе совсем про другое сказали, а ты понял совсем и не так?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: Нужно ли делать delete-ы в конце приложения?
От: MasterZiv СССР  
Дата: 01.12.09 21:25
Оценка:
SoulKeeper пишет:

> Объясните мне пожалуйста, что действительно delete делать не стоит? А


Не то, что стоит, а ОБЯЗАТЕЛЬНО!

Есть случаи, когда может быть нужно (приходится) НЕ вызывать delete-ы, но только
на определённых операционных системах и только разово и глобально выделяемых
объектов.

В общем, по умолчанию, в 99% случаев ты должен делать delete.
Posted via RSDN NNTP Server 2.1 beta
Re: Нужно ли делать delete-ы в конце приложения?
От: MasterZiv СССР  
Дата: 01.12.09 21:26
Оценка:
SoulKeeper пишет:

> Написал как-то приложение, мой начальник посмотрел и сказал: что у меня

> за глупость в приложении — в конце приложения стоят операторы delete для
> выделенной мной памяти операторами new. Ведь она же и так освободится по
> завершению процесса!

Начальнику же порекомендуй написать что-либо для DOS-а.
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Нужно ли делать delete-ы в конце приложения?
От: Erop Россия  
Дата: 01.12.09 22:54
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>Начальнику же порекомендуй написать что-либо для DOS-а.


А какие проблемы с DOS'ом?
Там куча была личным делом предложения и умирала вместе с ним, помнится...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.