куча памяти и ОС на выходе из процесса написанного на C ++ - PullRequest
4 голосов
/ 15 декабря 2010

У меня есть сомнения относительно роли операционной системы в отношении времени жизни процесса прямо сейчас.Я использую Linux.

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

Предположим, я не вызываю delete вконец приложения для всех этих объектов, обычно ОС освобождает / освобождает всю выделенную кучу, чтобы сделать ее доступной снова при выходе из процесса?Если процесс завершается из-за исключения или вызова return или exit, происходит ли это всегда?

Если это правда, это означает, что если я не вызову delete, это не повлияет наОС или другие приложения, работающие на машине.Правильно?

Я обычно использую boost shared pointers или delete, но я бы хотел прояснить это сомнение в контексте OS / Linux

С уважением AFG

Ответы [ 5 ]

5 голосов
/ 15 декабря 2010

Это правильно. Любая утечка памяти после жизненного цикла процесса в операционной системе защищенного режима - это очень неприятная ошибка в ядре (иногда происходит сбой процессов).

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

3 голосов
/ 15 декабря 2010

Современные операционные системы возвращают все ресурсы закрытого процесса. Не только память, но и файловые дескрипторы и т. Д.

2 голосов
/ 15 декабря 2010

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

Просто к вашему сведению, мой язык программирования намеренно не освобождает память при выходе по умолчанию: так быстрее Однако RAII не допускается. В C ++, если вы используете RAII, вам нужно быть более внимательным.

0 голосов
/ 15 декабря 2010

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

0 голосов
/ 15 декабря 2010

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

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

Но лучше, если программы обычно обрабатывают использованные ресурсы ОС.

(простите за мой английский)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...