2010-08-25 3 views
1

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

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

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

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

ответ

6

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

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

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

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

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

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

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

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

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

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

+1

Кроме того, профессионализм. – Joe

+0

@Hasturkun: Спасибо, я никогда не цитировал до –

+0

@ Joe: Что ты имеешь в виду? –

2

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

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

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

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

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

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

Смежные вопросы