Лучшее определение утечки памяти [закрыто]

StackOverflow https://stackoverflow.com/questions/312069

  •  10-07-2019
  •  | 
  •  

Вопрос

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

Пожалуйста, никаких определений в Википедии...

Каково ваше лучшее определение понятия утечка памяти и что же это за лучший способ чтобы предотвратить их?

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

Решение

Есть два определения (по крайней мере для меня):

Наивное определение: Не удалось освободить недоступную память, которая больше не может быть снова выделена каким-либо процессом во время выполнения процесса выделения. В основном это можно вылечить с помощью методов GC (Сборка мусора) или обнаружить автоматически.

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

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

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

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

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

Определение : сбой при освобождении памяти после выделения.

w:

  

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

Память, которая не освобождается, когда она больше не нужна, и больше не является "достижимой". Например, в неуправляемом коде, если я использую " new " для создания экземпляра объекта, но я не использую " удалить " когда я закончу (и мой указатель выйдет из области видимости или что-то в этом роде).

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

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

Утечка памяти:Также не удается освободить память, которая вам больше не нужна раньше:

  • Программа завершается
  • Выделяется дополнительная память

Лучший способ предотвратить утечку памяти:Освободите память, как только она больше не понадобится.

Существует два способа определения утечки памяти.

Во-первых, если данные не освобождаются, когда на них больше нет ссылок, эти данные недоступны (если у вас нет какого-либо поврежденного указателя или чтения данных в буфере или чем-то еще). По сути, если вы не освобождаете / удаляете данные, выделенные в куче, они становятся непригодными для использования и просто тратят память.

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

В этом первом определении данные обрабатываются сборщиками мусора, которые отслеживают количество ссылок на данные.

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

Этот второй тип утечки памяти часто происходит при написании небольших программ, использующих файловый ввод-вывод. Вы открываете файл, записываете свои данные, но не закрываете его, как только закончите. ФАЙЛ * все еще может находиться в пределах видимости и легко закрываться. Опять же, для этого может быть какая-то причина (например, блокировка доступа для записи другими программами), но для меня это признак плохого дизайна.

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

Вот несколько методов предотвращения / обнаружения утечек памяти:

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

  • Профилируйте свое приложение. Вы можете использовать инструменты отладчика памяти, такие как Valgrind или Purify, чтобы найти утечки.

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

  • Все определения, приведенные здесь (в то время, когда я писал это, мы получили лучшие ответы с тех пор), не соответствуют одному пограничному случаю:

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

    По " не удалось освободиться, когда закончите с этим " Стандартно это будет считаться утечкой, и я видел, как инструменты отчетов об утечках называют такие вещи утечками, поскольку память все еще использовалась. (И фактически код может не содержать код, способный очистить объект.)

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

    Утечка или нет?

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

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

    Чтобы предотвратить утечку памяти, попробуйте RIIA и всегда тестируйте свое программное обеспечение. Для этого есть множество инструментов.

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