2017-01-26 5 views
2

У меня есть программа, которая выполняет следующиеДолжен ли я освобождать память для короткой программы, если память не является проблемой?

  1. Выделение памяти (кучи)
  2. некоторой обработки
  3. Выделяет больше памяти (кучи)
  4. некоторой обработка

Это делает поэтому несколько раз выходите.

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

Было бы плохо, если бы не было свободной памяти в учетной записи, что на самом деле потребуется больше времени для обработки бесплатного/удаления, чем просто пропустить ее и перейти к следующему шагу.

В конце концов, программа выйдет, и это уже не имеет значения.

Я понимаю, что единственный способ быть уверенным - это сделать некоторые тесты на моем компьютере, но меня интересуют теоретические плюсы и минусы.

NB: давайте предположим современную ОС, которая очистит память при выходе.

+1

Возможный дубликат http://stackoverflow.com/questions/36584062/should-i-free-memory-before-exit –

+4

Это действительно невозможно ответить, иногда 'free()' будет выигрывать время. – Stargateur

+1

В этом случае вам может быть лучше всего работать в глобальных буферах/структурах. Это зависит от вашего варианта использования и действительно ли вы заранее знаете, каковы ваши максимальные требования. Если вы используете C++, вы должны использовать RAII, поэтому вы либо помечали это по ошибке, либо вы действительно должны прочитать, что такое RAII. – kamikaze

ответ

2

Существует ряд потенциальных проблем. Примеры включают;

  • Если вы не можете предсказать заранее, сколько памяти фактически необходимы - , который является одним из наиболее распространенных причин, чтобы использовать динамическую память распределения - то ваша программа может исчерпать доступную память (или из-за изнурительные системную память , или потому, что операционная система хоста налагает квоты на вашу программу). После это может работать или не работать так быстро, как требуется, но (даже игнорируя проблемы с памятью ), вероятно, будет работать некорректно и получить неверные результаты . Неважно, сколько памяти имеет ваша хост-система, или какая квота, которую система хоста обеспечивает для программы, которую она содержит - , можно исчерпать эту сумму.
  • Не все операционные системы выпускают память при выходе из программы. И среди тех, кто это делает, есть потенциал, что память не будет полностью выпущена - как из-за ошибок в самой ОС, так и из-за действий вашей программы (например, выделения ресурсов, которые совместно используются другими программами). В таких случаях, если ваша программа запускается несколько раз, вы можете обнаружить, что программа (при запуске в 32-й раз [для выбора случайного числа] или так) будет необъяснимо сбой.
  • Как программа выделяет больше памяти, тогда, в зависимости от того, как управление динамической памятью управляется (например, структуры данных, используемые malloc()), сами распределения могут замедляться, если память не освобождена. Это может привести к тому, что ваша программа не будет соответствовать ограничениям времени, поскольку она выделяет больше памяти. Освобождение памяти, когда она больше не нужна, может облегчить такие проблемы (хотя и с другими эффектами, такими как фрагментация памяти).
  • Если у вас есть привычка не выпускать динамически выделенную память, вы также можете (по аналогичным причинам «эффективности») не потрудились проверить, успешны ли распределения - в конце концов, это тоже требует времени. И это вызывает проблемы при сбоях в работе (например, ненормальные окончания программ, обход памяти, неправильные результаты без предупреждения и т. Д.).

Суть в том, что выделение памяти, а не освобождение от нее, является очень бедной (и ленивой) стратегией, если вы вообще не заботитесь о производительности программы или времени. Если вы действительно заботитесь о производительности/времени выполнения программы, вы фактически не будете динамически распределять память.

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

0

Это вряд ли зависит от того, где вы запускаете программу, а самая современная ОС очистит память, выделенную программой при выходе. Поэтому, пока вы не выделяете большие суммы, проблем не должно быть.

Но если вы работаете, это может быть неверно.

Редактирование: Если ОС освобождает память после выполнения, единственная проблема может заключаться в том, что вы выделяете больше, чем доступно. Но пока этого не происходит, я не вижу там проблемы. Это обычная практика для некоторых программ в наши дни.

+0

Я уточнил вопрос: предположим, что память очищена ОС. – Antzi

1

Где вы выделяете память ?, стек или кучу? В вашем случае я бы посоветовал вам выделить ваши вещи в стек (т. Е. Не использовать какие-либо функции выделения памяти).

Тем не менее, большинство ОС выделяет вашу долю кучи, когда ваша программа выходит. Если вы используете кучу, и вы используете современное C++-кодирование, вы хотите прочитать на Smart pointers.

Создание объекта стека имеет самый низкий удар производительности, и они основаны на области (что еще более холодно). Единственные минусы - очень ограниченное пространство.

Другой метод заключается в том, чтобы предварительно выделить кусок памяти изначально на кучу; и управлять выделенным пространством для использования, это распространено в эмуляторах.

+0

куча. Умные указатели аккуратные, но это то же самое, что и использование free/delete – Antzi

+0

Нет, они разные. 1. Они сохраняют u dev. раз, 2. Удаление происходит только тогда, когда материал выходит за рамки. –

+0

Более того, u должен быть осторожным с выделениями памяти. В конце, когда u по выделенной памяти, ваша программа будет замедляться, вся система тоже. Так что u не «убивайте» начальную оптимизацию u, цель которой - не использовать свободные методы, u должен удалять неиспользуемую память. –

3

Является ли освобождение выделенной памяти выигрышем или потерей производительности, зависит от ваших шаблонов распределения и от того, как вы используете память. Если вы free, будущее malloc s, вероятно, в конечном итоге повторное использование памяти предыдущих malloc. Это может сэкономить время, потому что эта старая память не будет получена из ОС, и она, скорее всего, будет в кеше. Ошибки страниц и промахи в кэше могут немного замедлить работу.

Если вам это интересно, сравните свободный и не освобождающий вариант вашей программы.

+0

Как вы сделали для меня: http://stackoverflow.com/a/41870241/4961259 –

0

Вы должны всегда освобождать выделенную память до завершения программы по нескольким причинам.

  1. Это обычно считается лучшей практикой.
  2. Непонятно, есть ли какая-либо польза (с точки зрения скорости выполнения), позволяющая очистить после вас время выполнения.
  3. Это позволяет избежать утечек памяти, если среда выполнения не может собрать всю память.
  4. Если вы когда-либо расширяете эту программу или строите ее, утечка памяти может распространяться на другой код.

Кроме того, в C++ вы должны избежать необходимости «ручной» управление памятью и опираться на методы RAII, например, как это предусмотрено в стандартной библиотеке с помощью своих контейнеров и смарт-указатели.