Освобождение в atexit()

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

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

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

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

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