Разница между висячим указателем и утечкой памяти

79

Я не понимаю разницы между висящим указателем и утечкой памяти. Как связаны эти два термина?

мертвый программист
источник

Ответы:

144

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

Обычный способ получить висящий указатель:

Вы возвращаете адрес, который был локальной переменной, которая вышла бы за пределы области действия, если бы контроль времени был возвращен вызывающей функции. (Неопределенное поведение)

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


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

Char-ptr ch - это локальная переменная, которая выходит за пределы области видимости в конце функции, что приводит к утечке динамически выделяемых 10 байт .

Анируд Раманатан
источник
Эта статья также может быть полезной stackoverflow.com/questions/127386/…
bkausbk
22

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

Когда вы освобождаете область памяти, но при этом сохраняете на нее указатель, этот указатель болтается:

Когда вы теряете указатель, но сохраняете выделенную память, происходит утечка памяти:

Грег Иноземцев
источник
16

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

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

Они связаны тем, что обе представляют собой ситуации, связанные с неправильно управляемыми указателями, особенно в отношении динамически выделяемой памяти. В одной ситуации (висячий указатель) вы, вероятно, освободили память, но впоследствии попытались на нее ссылаться; в другом случае (утечка памяти) вы забыли полностью освободить память!

maerics
источник
6

Свисающий указатель

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

Вывод: значение мусора

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

Объяснение: переменная x является локальной переменной. Его область действия и время жизни находятся в пределах вызова функции, поэтому после возврата адреса x переменная x стала мертвой, а указатель все еще указывает, ptr все еще указывает на это место.

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

Утечка памяти

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

Питер Паркер
источник
3

Указатель помогает создать определяемую пользователем область видимости переменной, которая называется динамической переменной. Динамическая переменная может быть одной переменной или группой переменных одного типа ( array) или группой переменных разных типов (struct ). Область локальной переменной по умолчанию начинается, когда управление входит в функцию, и заканчивается, когда управление выходит из этой функции. Глобальная изменяемая область действия по умолчанию начинается при выполнении программы и заканчивается после ее завершения.

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

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

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

рашок
источник
3

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

Висячий указатель : указатель на переменную в стеке, но без памяти в куче.

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

user2264571
источник
3
ваш пример для висячего указателя на самом деле не является висячим указателем, а является указателем NULL. Правильным примером было бы динамическое присвоение памяти указателю, скажем, с помощью malloc (), а затем free () этой памяти, это делает его висящим указателем. ПРИМЕЧАНИЕ: после освобождения мы не присвоили ему значение NULL, поэтому указатель по-прежнему указывает на тот же адрес памяти, что делает его висящим указателем. Теперь, если вы попытаетесь получить доступ к этой памяти, используя тот же указатель (то есть разыменовать указатель), вы можете закончить получение ошибки сегментации.
жертву
0

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

для получения дополнительной информации нажмите ЗДЕСЬ

Ниравдас
источник
0

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

  1. Освобождение памяти
  2. Вызов функции
  3. Переменная выходит за рамки

—— с https://www.geeksforgeeks.org/dangling-void-null-wild-pointers/

Лалит
источник