Освобождение в атаке () - PullRequest
       32

Освобождение в атаке ()

11 голосов
/ 23 октября 2008

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

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

Есть ли польза от того, чтобы привести себя в порядок и активно убирать его?

Ответы [ 8 ]

20 голосов
/ 23 октября 2008

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

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

14 голосов
/ 23 октября 2008

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

12 голосов
/ 28 октября 2008

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

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

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

10 голосов
/ 23 октября 2008

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

6 голосов
/ 03 июня 2010

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

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

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

5 голосов
/ 24 октября 2008

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

2 голосов
/ 23 октября 2008

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

1 голос
/ 11 ноября 2008

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

...