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

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

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

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



**Висячий указатель**

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

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

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

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

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

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

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



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

**Свисающий указатель**: Когда переменная указателя в стеке, но нет памяти в куче.

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



[свисающий указатель](https://en.wikipedia.org/wiki/Dangling_pointer) это значение, которое имеет значение (не NULL), которое относится к некоторой памяти, которая недопустима для ожидаемого типа объекта. Например, если вы установили указатель на объект, то перезаписали эту память чем-то другим, не связанным, или освободили память, если она была выделена динамически.

[утечка памяти](https://en.wikipedia.org/wiki/Memory_leak) это когда вы динамически выделяете память из кучи, но никогда не освобождаете ее, возможно, потому что вы потеряли все ссылки на нее.

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



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

для получения дополнительной информации нажмите[ВОТ](https://www.geeksforgeeks.org/dangling-void-null-wild-pointers/)



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

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

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

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



**[свисающий указатель](https://en.wikipedia.org/wiki/Dangling_pointer)** указывает на память, которая уже была освобождена. Хранилище больше не выделено. Попытка получить к нему доступ может вызвать ошибку сегментации.

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

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

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

**[утечка памяти](https://www.ibm.com/developerworks/aix/library/au-toughgame/)** это память, которая не имеетПосле того, как он был освобожден, нет возможности получить доступ (или освободить его) сейчас, так как больше нет способов добраться до него. (Например, указатель, который**было** единственная ссылка на ячейку памяти**динамически распределяется** (и не освобожден), который указывает куда-то еще сейчас.)

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



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

Распределение памятиВызов функцииПеременная выходит из области видимости от<https://www.geeksforgeeks.org/dangling-void-null-wild-pointers/>