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

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

Ответы на вопрос(8)

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

char *c = malloc(16);
free(c);
c[1] = 'a'; //invalid access through dangling pointer!

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

void myfunc()
{
    char *c = malloc(16);
} //after myfunc returns, the the memory pointed to by c is not freed: leak!

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

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

#include<stdio.h>

  int *call();

  void main(){

      int *ptr;
      ptr=call();

      fflush(stdin);
      printf("%d",*ptr);

   }

 int * call(){

   int x=25;
   ++x;
   return &x;
 }
</stdio.h>

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

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

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

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

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

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

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


char *newarea=(char *)malloc(10);

myarea=newarea;

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

char *p =NULL;

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

 Prince Vijay Pratap20 сент. 2015 г., 02:43
@sactiw абсолютно верно
 sactiw16 сент. 2014 г., 07:54
Ваш пример для висячего указателя на самом деле не висячий указатель, а пустой указатель. Правильный пример - динамическое назначение памяти указателю, скажем, с помощью malloc (), а затем освобождение этой памяти, что делает его висящим указателем.НОТА: после освобождения у нас нетt присвоил ему значение NULL, поэтому указатель по-прежнему указывает на тот же адрес памяти, что делает его висящим указателем. Теперь, если вы попытаетесь получить доступ к этой памяти с помощью того же указателя (то есть разыменовать указатель), вы можете прекратить получать ошибку сегментации.

свисающий указатель это значение, которое имеет значение (не 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); 
 }
</stdio.h></stdlib.h>

для получения дополнительной информации нажмитеВОТ

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

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

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

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

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

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

char *func()
{
   char str[10];
   strcpy(str, "Hello!");
   return str; 
}
//returned pointer points to str which has gone out of scope. 

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

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

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 байтов.

 bkausbk19 июл. 2013 г., 09:43
Эта статья также может быть полезнойstackoverflow.com/questions/127386/...

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

Распределение памятиВызов функцииПеременная выходит из области видимости

 отhttps://www.geeksforgeeks.org/dangling-void-null-wild-pointers/

Ваш ответ на вопрос