Должен ли я освобождать выделенную память при ненормальном завершении?

Моя программа (текстовый браузер) динамически выделяет память.

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

Теперь, что я не делаю, это освобождение памяти до аномального завершения. (В настоящее время моя программа завершается сигналами и после неудачных mallocs/reallocs.)

Мой вопрос: вы считаете этот плохой стиль? Должен ли я освобождаться от аномального завершения?

Ответ 1

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

Ответ 2

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

С другой стороны, другие ресурсы (например, открытые файлы) должны быть закрыты или, по крайней мере, сброшены - если нет, они не могут быть сохранены/сохранены неполными из-за буферизации.

Ответ 3

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

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

Ответ 4

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

Мы выделяем/освобождаем память с помощью OS-директив, чтобы не-глючная операционная система отслеживала фрагменты памяти для каждого процесса и переводила их в смежное пространство виртуальной памяти. После процесса-смерти ОС-загрузчик сигнализирует об этом, и вся память набирается. Все становится сложнее, когда процессы обмениваются памятью.

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

Я советую вам проверить всю память, хранящуюся до и после ненормальных сценариев завершения.

Ответ 5

Только если ваша ОС не восстанавливает память при завершении программы. DOS и его "липкая память" - пример такой ОС. В большинстве современных ОС не бесплатно() при ненормальном завершении не является проблемой.

Ответ 6

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

Ответ 7

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