Linux и утечки памяти - PullRequest
       4

Linux и утечки памяти

1 голос
/ 25 августа 2010

Linux автоматически повторно запрашивает всю память, используемую приложениями немедленно?

Если это так, то должно ли приложение действительно беспокоиться об освобождении всей памяти перед выходом?

Действительно ли стоит вызывать деструктор каждого класса в многопоточном приложении перед вызовом exit (0)?

Если Linux всегда повторно запрашивает всю память, используемуюприложение немедленно, тогда утечки памяти - это только висячие указатели, созданные приложением, и это только его время жизни.

Ответы [ 2 ]

6 голосов
/ 25 августа 2010

Linux автоматически повторно запрашивает всю память, используемую приложениями немедленно?

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

Если так, то должно ли приложение беспокоиться об освобождении всей памяти перед выходом?

Да, по нескольким причинам:

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

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

Действительно ли стоит вызывать деструктор каждого класса в многопоточном приложении перед вызовом exit (0)?

Это почти то же самое, что и последний вопрос. Также обратите внимание, что не освобождение ресурсов от сторонних производителей и библиотек ОС - это то же самое, что не освобождение памяти.

Если Linux всегда повторно запрашивает всю память, используемую приложением, сразу же, то утечки памяти - это только висячие указатели, созданные приложением, и это также только его время жизни.

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

2 голосов
/ 25 августа 2010

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

Если они занимаются другими делами, такими как файлы на флэш-диске, на которых могут быть неписанные данные, это может быть важно.*

Кстати, я большой поклонник вызова библиотеки _exit () - это похоже на exit (), но обработчики atexit не запускаются.

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

Конечно, есть и другие способы утечки ресурсов - это не просто память.Временные файлы очевидны - они будут существовать после вызова _exit.

Кроме того, если вы создаете общую память posix или sysv, она остается существующей при выходе из процесса.Это действительно похоже на временный файл (в Linux он реализован как файл на tmpfs в ядре)

...