Подтвердить что ты не робот

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

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

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

Какое ваше лучшее определение утечка памяти и что является лучшим способом для предотвращения их?

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

Mozilla имеет отличную страницу для инструментов для отслеживания утечек памяти.

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

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

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

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

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

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

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

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

Ответ 7

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

  • Программа завершает
  • Добавлена ​​дополнительная память

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

Ответ 8

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

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

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

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

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

Ответ 9

w:

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

Ответ 10

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

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

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

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

Ответ 11

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

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

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