Могу ли я вызвать утечки памяти во время отладки моей программы? - PullRequest
2 голосов
/ 04 декабря 2009

Я занимаюсь разработкой на Ubuntu 9.10

Я пишу программу на C, во время своих тестов и отладок я вызываю malloc и всегда забываю вызвать free () - это, очевидно, только во время отладки.

Мне любопытно: я съедаю свободную память, которую система имеет на каждом сеансе отладки? Или ядро ​​очищает память процесса после завершения работы моего приложения из IDE? Логически рассуждая, я почти уверен, что ядро ​​знает обо всем процессе, который уничтожается, и, следовательно, знает, какую память оно выделило, и, таким образом, даже если приложение не вызывало free, память все еще освобождается.

Буду признателен за объяснение.

Спасибо, Максим.

Ответы [ 4 ]

7 голосов
/ 04 декабря 2009

Да, ОС восстановит всю память, выделенную вашей программе, когда она остановится.

2 голосов
/ 04 декабря 2009

Ядро имеет коллекцию записей процессов в памяти ядра и отслеживает каждый процесс, объем потребляемой памяти, такие ресурсы, как ввод / вывод, дескрипторы файлов или inode. Записи процесса обычно хранятся в очереди, в которой указатель задачи ядра указывает на запись процесса бесконечным образом (это объясняет, почему восприятие «многозадачности», это делает мгновение ока - так быстро действительно, это делает единую задачу в глазах ядра). В записи процесса есть поле, которое сообщает, сколько памяти было потрачено данным процессом.

Да, ядро ​​получает память обратно в свой пул, готовый для использования другим процессом. Более того, вы абсолютно на 100% правы в отношении утечек памяти, как указывал Джон Уэлдон. Я упоминал об этом в другой публикации , для каждого malloc есть бесплатный, если нет, у вас есть утечка памяти. Так что не беспокойтесь о сеансе отладки. Это совершенно нормально, поскольку ядро ​​несет ответственность за то, чтобы память была возвращена.

Некоторые приложения (особенно демоны) должны быть отлажены должным образом, и в нем не должно быть утечек памяти, так как демон будет работать долгое время до следующей перезагрузки. Кстати, в моей любимой книге «Программирование на Expert C, Deep C Secrets - Peter Van Der Linden» упоминалось, что когда-то, когда он был в Sun, существовал инструмент для печати printtool, но очень часто очередь заклинило из-за утечки памяти в программе диспетчера очереди печати, и перезагрузка машины Sun вылечила ее, он подробно описывает это в связи с утечками памяти.

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

2 голосов
/ 04 декабря 2009

Вы правы.

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

Утечки памяти, как правило, возникают только при длительном запуске процесса.

1 голос
/ 04 декабря 2009

Многие старые приложения Unix плохо пропускали память и рассчитывали на очистку в конце процесса. Даже в условиях ограниченного адресного пространства в те дни он работал достаточно хорошо. Конечно, это не работает с долго работающими приложениями. Я не буду беспокоиться о последствиях утечек памяти при отладке (сами утечки являются ошибками, поэтому вы захотите удалить их перед выпуском).

Что происходит в Unix и всех других современных ОС, с которыми я на самом деле знаком, так это то, что ОС выделяет память процессу. malloc() извлекает память из памяти процесса, и если он запрашивает больше, чем может предоставить процесс, запросит больше памяти процесса из ОС. Если в программе есть утечка памяти, память процесса может вырасти настолько большой, насколько это позволяет система, но это все память процесса, и все выделение ресурсов уйдет, когда процесс завершится.

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

...