Я не понимаю разницы между висящим указателем и утечкой памяти. Как связаны эти два термина?
Оборванный указатель указывает на память, уже освобожденные. Хранилище больше не выделяется. Попытка получить к нему доступ может вызвать ошибку сегментации.
Обычный способ получить висящий указатель:
char *func()
{
char str[10];
strcpy(str, "Hello!");
return str;
}
//returned pointer points to str which has gone out of scope.
Вы возвращаете адрес, который был локальной переменной, которая вышла бы за пределы области действия, если бы контроль времени был возвращен вызывающей функции. (Неопределенное поведение)
Другой распространенный пример висячего указателя - это доступ к области памяти через указатель после того, как free был явно вызван в этой памяти.
int *c = malloc(sizeof(int));
free(c);
*c = 3; //writing to freed location!
Утечка памяти является память , которая не была освобождена, нет никакого способа доступа (или освободить его) в настоящее время, так как нет способа добраться до него больше. (Например, указатель, который был единственной ссылкой на динамически выделяемую (а не освобожденную) ячейку памяти, которая теперь указывает на другое место.)
void func(){
char *ch = malloc(10);
}
//ch not valid outside, no way to access malloc-ed memory
Char-ptr ch - это локальная переменная, которая выходит за пределы области видимости в конце функции, что приводит к утечке динамически выделяемых 10 байт .
Вы можете думать об этом как о противоположностях друг друга.
Когда вы освобождаете область памяти, но при этом сохраняете на нее указатель, этот указатель болтается:
char *c = malloc(16); free(c); c[1] = 'a'; //invalid access through dangling pointer!
Когда вы теряете указатель, но сохраняете выделенную память, происходит утечка памяти:
void myfunc() { char *c = malloc(16); } //after myfunc returns, the the memory pointed to by c is not freed: leak!
источник
Оборванный указатель является тот , который имеет значение (не NULL) , которая относится к некоторой памяти , которая не является действительной для типа объекта , который вы ожидаете. Например, если вы устанавливаете указатель на объект, а затем перезаписываете эту память чем-то другим, не связанным с ней, или освобождаете память, если она выделялась динамически.
Утечка памяти , когда вы динамически выделять память из кучи , но никогда не освободит его, возможно , потому , что вы потеряли все ссылки на него.
Они связаны тем, что обе представляют собой ситуации, связанные с неправильно управляемыми указателями, особенно в отношении динамически выделяемой памяти. В одной ситуации (висячий указатель) вы, вероятно, освободили память, но впоследствии попытались на нее ссылаться; в другом случае (утечка памяти) вы забыли полностью освободить память!
источник
Свисающий указатель
Если какой-либо указатель указывает адрес памяти какой-либо переменной, но после того, как некоторая переменная была удалена из этой ячейки памяти, указатель все еще указывает на такую ячейку памяти. Такой указатель известен как висячий указатель, и эта проблема известна как проблема висячего указателя.
#include<stdio.h> int *call(); void main(){ int *ptr; ptr=call(); fflush(stdin); printf("%d",*ptr); } int * call(){ int x=25; ++x; return &x; }
Вывод: значение мусора
Объяснение: переменная x является локальной переменной. Его область действия и время жизни находятся в пределах вызова функции, поэтому после возврата адреса x переменная x стала мертвой, а указатель все еще указывает, ptr все еще указывает на это место.
Решение этой проблемы: Сделайте переменную x статической. Другими словами, мы можем сказать, что указатель, указывающий объект которого был удален, называется висячим указателем.
Утечка памяти
В информатике утечка памяти происходит, когда компьютерная программа неправильно управляет выделением памяти. В соответствии с простым мы выделили память, а не Свободный другой язык, термин, скажем, не выпускать, это вызов утечки памяти, это фатально для приложения и неожиданного сбоя.
источник
Указатель помогает создать определяемую пользователем область видимости переменной, которая называется динамической переменной. Динамическая переменная может быть одной переменной или группой переменных одного типа (
array
) или группой переменных разных типов (struct
). Область локальной переменной по умолчанию начинается, когда управление входит в функцию, и заканчивается, когда управление выходит из этой функции. Глобальная изменяемая область действия по умолчанию начинается при выполнении программы и заканчивается после ее завершения.Но область действия динамической переменной, которая хранится указателем, может начинаться и заканчиваться в любой момент выполнения программы, что должно быть решено программистом. Свисание и утечка памяти проявляются только в том случае, если программист не обрабатывает конец области видимости.
Утечка памяти произойдет, если программист не напишет код (
free
указателя) для конца области видимости динамических переменных. В любом случае, как только программа завершит работу, вся память процесса будет освобождена, тогда же будет освобождена и утечка памяти. Но это вызовет очень серьезную проблему для процесса, который выполняется долгое время.Как только область видимости динамической переменной подходит к концу (освобождается), она
NULL
должна быть назначена переменной-указателю. В противном случае, если код получит неправильный доступ, произойдет неопределенное поведение. Таким образом, висячий указатель - это не что иное, как указатель, указывающий на динамическую переменную, область действия которой уже завершена.источник
Утечка памяти : когда в куче есть область памяти, но нет переменной в стеке, указывающей на эту память.
char *myarea=(char *)malloc(10); char *newarea=(char *)malloc(10); myarea=newarea;
Висячий указатель : указатель на переменную в стеке, но без памяти в куче.
char *p =NULL;
Висячий указатель пытается разыменовать без выделения места, что приведет к ошибке сегментации.
источник
Указатель, указывающий на область памяти, которая была удалена (или освобождена), называется висячим указателем.
#include <stdlib.h> #include <stdio.h> void main() { int *ptr = (int *)malloc(sizeof(int)); // After below free call, ptr becomes a // dangling pointer free(ptr); }
для получения дополнительной информации нажмите ЗДЕСЬ
источник
—— с https://www.geeksforgeeks.org/dangling-void-null-wild-pointers/
источник