2008-10-23 2 views
10

Есть ли смысл освобождать память в функции atexit()?Освобождение в atexit()

У меня есть глобальная переменная, которая получает malloc'ed после запуска. Я мог бы написать функцию atexit(), чтобы освободить ее, но разве система не будет восстанавливать всю эту память, когда программа все равно выйдет?

Есть ли какая-либо польза для удобства и активной очистки?

+0

Звучит как обман, см. Http://stackoverflow.com/questions/2213627/when-you- экзит-ас-приложение-это-заместитель таНос-эд-память автоматически освобожденная. – unwind

ответ

19

Не в C - это как перестановка шезлонгов, когда корабль опускается вокруг вас.

В C++ ответ отличается, поскольку объекты могут удалять временные файлы и т. Д. В своих деструкторах, поэтому вам нужно убедиться, что они вызваны.

10

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

+2

+1, указав, что это особенность операционной системы, а не языка. – unwind

12

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

+0

Говоря об утечке памяти: http://valgrind.org. – JesperE

+0

Очистка используется для проверки утечек памяти перед вызовом очистки atexit(). Это было неприятно. Но это было еще десять лет назад - с тех пор это могло измениться. –

2

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

4

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

10

Как обычно, malloc()/free() обычно включает в себя обширные структуры данных, которые существуют в пользовательском пространстве, free() Память, когда ваша программа заканчивается, может фактически быть утечкой производительности. Если части структуры данных выгружаются на диск, их нужно загружать с диска только для того, чтобы их отбросить!

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

Конечно free() ING в других случаях, как правило, выгодно, поскольку дальнейшее malloc() s может повторно использовать пространство вы освобожденные и free() даже может отменить отображение некоторой памяти, которая затем может быть использована другими процессами.

1

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

5

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

Написание функций очистки «лениво», т. Е. Только тогда, когда вам нужно, это более подвержено ошибкам. Написание функций очистки заставляет вас думать об очистке и возможной зависимости от очистки. Это позволяет более простое повторное использование кода части вашего кода в другом проекте.

Итак, да, освобождение в atexit бесполезно, и поэтому закрывается дескриптор файла.Однако писать и поддерживать функцию очистки по мере роста вашего кода может быть ограничением, которое заставит вас задуматься о том, что вы делаете.

Смежные вопросы