Здравствуйте, 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-ы в конце приложения?
Здравствуйте, SaZ, Вы писали:
SaZ>Если был new double — то delete тоже нужен. Но вот вызов delete при atexit (как выше было написано)- спорный вариант.
Да дело не в atexit, он вообще сказал, что очищать любые объекты перед выходом — бред, по типу даже если это delete [] my_numbers; в деструкторе глобального класса (который уничтожается вместе с приложением).
И насколько я понял, получается он прав, ведь этот массив double* numbers все равно будет освобожден как и вся куча. Или я неправильно понял?
Re[7]: Нужно ли делать delete-ы в конце приложения?
SH>>- освобождение памяти на этом этапе и правда бессмысленно. Пожалуй тут согласен с начальником. Хотя оно и никому не мешает.
I>К fclose эти рассуждения тоже относятся?
Не относится, т.к. по закрытию приложения все handle-ы будут освобождены. Но это не относится, например, к именованным мьютексам.
Re[7]: Нужно ли делать delete-ы в конце приложения?
Здравствуйте, igna, Вы писали:
SH>>- освобождение памяти на этом этапе и правда бессмысленно. Пожалуй тут согласен с начальником. Хотя оно и никому не мешает.
I>К fclose эти рассуждения тоже относятся?
Я же специально написал и даже курсивом не поленился выделить, что это относится к освобождению памяти.
Все остальные случаи нужно рассматривать подробно и отдельно, сразу про всё не сказать.
С fclose этот номер может не пройти, если fwrite и прочие буферизирует вывод. Тогда часть данных может остаться в буфере. Если же не буферизирует, [любая вменяемая] ОС закроет файл сама и всё будет нормально. На такие вещи, конечно, лучше не полагаться.
Делай что должно, и будь что будет
Re[6]: Нужно ли делать delete-ы в конце приложения?
Здравствуйте, SergH, Вы писали:
SH>Это я просто неправильно понял твою ситуацию. Когда ты написал про delete в деструкторе, я предположил следующее:
Вот спасибо, как раз про удаление переменных в деструкторе я и спрашивал, потому что было высказывание по поводу любого удаления в конце (не только случай atexit), в том числе и в деструкторах.
SH>Хотя в конце, конечно, тоже всё освободится, но это может оказаться немного поздно.
Но ведь по его мнению все равно освободится
Остался последний вопрос а как умудряются завершенные процессы (например, некоторые игры) отъесть "безвозвратно" часть памяти, если все равно вся память (heap) по завершению освобождается, за исключением разделяемых разными процессами переменных?
Re[2]: Нужно ли делать delete-ы в конце приложения?
Здравствуйте, SergeyT., Вы писали:
ST>З.Ы. а вообще, в ветке верно говорили, что нужно почитать о том, что такое RAII и почему плохо руками вызывать delete. Смотреть книги Мейерса, Страуструпа, Саттера (цикл статей Саттера о безопасности исключений очень быстро отбивает всякую охоту в ручном управлении ресурсами).
Да, спасибо обязательно почитаю про RAII и smart pointer.
Re[7]: Нужно ли делать delete-ы в конце приложения?
Здравствуйте, SoulKeeper, Вы писали:
SK>Но ведь по его мнению все равно освободится
Ну да. Приложение завершится из-за того, что кончилась память в куче, при завершении приложения память освободится, запускай заново спокойно и работай
Проблема с объектами в том, что без применения сверхъестественных сил ты не можешь гарантировать, кто и как будет его использовать в будущем. Поэтому объект должен быть написан так, чтобы сюрпризов было поменьше. Требование очищать используемые ресурсы является стандартным и подразумевается по умолчанию любым разработчиком, использующим твой объект. Если это требование не выполняется -- это очень неприятный сюрприз.
SK>Остался последний вопрос а как умудряются завершенные процессы (например, некоторые игры) отъесть "безвозвратно" часть памяти, если все равно вся память (heap) по завершению освобождается, за исключением разделяемых разными процессами переменных?
На уровне С++ ответа на этот вопрос нет. Какие-то системно-зависимые вещи, которые ОС почему-то не может почистить за процессом. В зависимости от ситуации, скорее всего можно рассматривать как баг в ОС. По идее отдельный процесс не должен быть способен таким образом повлиять на всю систему.
Здравствуйте, SoulKeeper, Вы писали:
SK>Здравствуйте, SaZ, Вы писали:
SaZ>>Если был new double — то delete тоже нужен. Но вот вызов delete при atexit (как выше было написано)- спорный вариант.
SK>И насколько я понял, получается он прав, ведь этот массив double* numbers все равно будет освобожден как и вся куча. Или я неправильно понял?
Возможна такая система, которая не будет подчищать память за приложением.
Re[3]: Нужно ли делать delete-ы в конце приложения?
Здравствуйте, SoulKeeper, Вы писали:
SK>Спасибо, это понял. А если не объект удаляется , а, например, массив чисел, то delete в принципе не обязательно? Как то странно все это, меня учили, что если есть new, то должен быть delete, а тут до меня докапываются, что я зря написал их
Тебе лучше всё-таки писать delete там, где надо, потому что для тебя это на уровне правил, которые ты ещё не понимаешь.
Re[5]: Нужно ли делать delete-ы в конце приложения?
Здравствуйте, SoulKeeper, Вы писали:
SK>Да дело не в atexit, он вообще сказал, что очищать любые объекты перед выходом — бред, по типу даже если это delete [] my_numbers; в деструкторе глобального класса (который уничтожается вместе с приложением).
Де факто ОС конечно подотрёт за нагадившим, но я б такого разработчика жестоко бил по голове железной палкой, ибо такой код содержит грубейшую ошибку управления ресурсами и потому не реюзабелен.
И если вдруг в какой то момент этот класс перестанет быть глобальным то на ровном месте получим "полну жопу огурцов". И все только потому, что какому то лентяю было впадлу прибрать за собой.
Так что не слушай дебилов, а еще лучше смени работу. Потому как такие тараканы обычно не водятся поодиночке, и есть риск что из головы начальства скоро попрёт вша красная, вша жОлтая и еще более суровые усеницы.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: Нужно ли делать delete-ы в конце приложения?
Здравствуйте, SoulKeeper, Вы писали:
SK>Здравствуйте, SaZ, Вы писали:
SaZ>>Если был new double — то delete тоже нужен. Но вот вызов delete при atexit (как выше было написано)- спорный вариант.
SK>Да дело не в atexit, он вообще сказал, что очищать любые объекты перед выходом — бред, по типу даже если это delete [] my_numbers; в деструкторе глобального класса (который уничтожается вместе с приложением). SK>И насколько я понял, получается он прав, ведь этот массив double* numbers все равно будет освобожден как и вся куча. Или я неправильно понял?
Поинтересуйся у начальства, а зачем вообще освобождать память и правильно проектировать приложения?
Здравствуйте, SoulKeeper, Вы писали:
SK>Здравствуйте. SK>Написал как-то приложение, мой начальник посмотрел и сказал: что у меня за глупость в приложении — в конце приложения стоят операторы delete для выделенной мной памяти операторами new. Ведь она же и так освободится по завершению процесса!
SK>Объясните мне пожалуйста, что действительно delete делать не стоит? А если у меня небольшое приложение, которое недолго работает, так вообще ни одного delete для выделенной памяти не нужно? SK>Чувствую себя опплеванным дураком, а возразить то вроде и нечего.
Можно использовать идиому вроде
#ifndef NDEBUG
delete ...
#endif
для удаления примитивных типов, например если удаляется реально много объектов, и это удаление занимает, скажем, секунду.
Здравствуйте, SoulKeeper, Вы писали:
SK>Здравствуйте. SK>Написал как-то приложение, мой начальник посмотрел и сказал: что у меня за глупость в приложении — в конце приложения стоят операторы delete для выделенной мной памяти операторами new. Ведь она же и так освободится по завершению процесса!
Да ладно, это ж начальник! Ему же надо что-то умное сказать и поучить "молодое поколение". Видимо, больше не нашел к чему придраться
Re[8]: Нужно ли делать delete-ы в конце приложения?
Здравствуйте, SergeyT., Вы писали:
ST>Здравствуйте, igna, Вы писали:
SH>>>- освобождение памяти на этом этапе и правда бессмысленно. Пожалуй тут согласен с начальником. Хотя оно и никому не мешает.
I>>К fclose эти рассуждения тоже относятся?
ST>Не относится, т.к. по закрытию приложения все handle-ы будут освобождены. Но это не относится, например, к именованным мьютексам.
Причём тут мьютексы, да ещё обязательно именованные ? Они ничем от файлов не отличаются в этом плане. Их хендлы точно так же будут закрыты.
kalsarikännit
Re[5]: Нужно ли делать delete-ы в конце приложения?
Здравствуйте, SoulKeeper, Вы писали:
SK>И насколько я понял, получается он прав, ведь этот массив double* numbers все равно будет освобожден как и вся куча. Или я неправильно понял?
Вообще-говоря, это от окружения программы зависит. В винде или линуксе границы процесса преодолеть не так-то и просто. А вот на какой-нибудь железке вполне возможны варианты...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, SoulKeeper, Вы писали:
SK>Чувствую себя опплеванным дураком, а возразить то вроде и нечего.
Слушай, а ты уверен, что верно понял начальника?
Случаи они того, разные бывают...
Не могло быть так, что он поручил тебе написать какую-то нужную программу, а ты, вместо этого, написал самопальный синглетон с delete (double*) в atexit, который и отлаживал пару месяцев?...
Зачем тебе вообще понадобился синглетон с вектором из double?
Чем тебе просто глобальный std::vector<double> не подоёшл? И почему он сенглитон, кстати? Это зачем теюе понадобилось?
Шнфа твоего мы тут выслушать не можем, может ты расскажешь подробнее про свою задачу?
А то вдруг правда тебе совсем про другое сказали, а ты понял совсем и не так?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
SoulKeeper пишет:
> Объясните мне пожалуйста, что действительно delete делать не стоит? А
Не то, что стоит, а ОБЯЗАТЕЛЬНО!
Есть случаи, когда может быть нужно (приходится) НЕ вызывать delete-ы, но только
на определённых операционных системах и только разово и глобально выделяемых
объектов.
В общем, по умолчанию, в 99% случаев ты должен делать delete.
SoulKeeper пишет:
> Написал как-то приложение, мой начальник посмотрел и сказал: что у меня > за глупость в приложении — в конце приложения стоят операторы delete для > выделенной мной памяти операторами new. Ведь она же и так освободится по > завершению процесса!
Начальнику же порекомендуй написать что-либо для DOS-а.
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Нужно ли делать delete-ы в конце приложения?
Здравствуйте, MasterZiv, Вы писали:
MZ>Начальнику же порекомендуй написать что-либо для DOS-а.
А какие проблемы с DOS'ом?
Там куча была личным делом предложения и умирала вместе с ним, помнится...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском