Вопрос

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top