Różnica między wiszącym wskaźnikiem a wyciekiem pamięci

79

Nie rozumiem różnicy między wiszącym wskaźnikiem a wyciekiem pamięci. Jak te dwa terminy są powiązane?

martwy programista
źródło

Odpowiedzi:

144

A wskaźnik zwisające punkty do pamięci, która została już zwolniona. Magazyn nie jest już przydzielony. Próba uzyskania do niego dostępu może spowodować błąd segmentacji.

Typowy sposób na zakończenie z wiszącym wskaźnikiem:

Zwracasz adres, który był zmienną lokalną, która wyszłaby poza zakres, gdyby kontrola czasu została zwrócona do funkcji wywołującej. (Niezdefiniowane zachowanie)

Innym typowym przykładem wiszącego wskaźnika jest dostęp do lokalizacji pamięci za pośrednictwem wskaźnika, po jawnym wywołaniu free w tej pamięci.


Wyciek pamięci jest pamięć, która nie została zwolniona, nie ma sposobu, aby uzyskać dostęp (lub zwolnić go) teraz, ponieważ nie istnieją sposoby, aby dostać się do niego już. (Np. Wskaźnik, który był jedynym odniesieniem do lokalizacji pamięci przydzielanej dynamicznie (i nie zwalnianej), który wskazuje teraz gdzie indziej.)

Char-ptr ch jest zmienną lokalną, która na końcu funkcji wychodzi poza zakres, powodując wyciek z dynamicznie przydzielonych 10 bajtów .

Anirudh Ramanathan
źródło
Ten artykuł może być również pomocne stackoverflow.com/questions/127386/...
bkausbk
22

Możesz myśleć o nich jako o swoich przeciwieństwach.

Kiedy zwolnisz obszar pamięci, ale nadal utrzymujesz do niego wskaźnik, wskaźnik ten zwisa:

Gdy zgubisz wskaźnik, ale zachowasz przydzieloną pamięć, masz wyciek pamięci:

Greg Inozemtsev
źródło
16

Zwisające wskaźnik jest taki, który ma wartość (NOT NULL), który odnosi się do jakiejś pamięci, która nie jest ważny dla tego typu obiektu można się spodziewać. Na przykład, jeśli ustawisz wskaźnik na obiekt, nadpisujesz tę pamięć czymś innym niepowiązanym lub zwolnisz pamięć, jeśli została przydzielona dynamicznie.

Wyciek pamięci jest, kiedy dynamicznie przydzielić pamięci ze sterty ale nigdy uwolnić go, być może dlatego, że stracił wszystkie odwołania do niego.

Są one powiązane w tym sensie, że są to sytuacje związane z niewłaściwie zarządzanymi wskaźnikami, zwłaszcza w przypadku dynamicznie przydzielanej pamięci. W jednej sytuacji (wiszący wskaźnik) prawdopodobnie zwolniłeś pamięć, ale później próbowałeś się do niej odwołać; w drugim (wyciek pamięci) zapomniałeś całkowicie zwolnić pamięć!

maerics
źródło
6

Wskaźnik wiszący

Jeśli jakikolwiek wskaźnik wskazuje adres pamięci dowolnej zmiennej, ale po usunięciu jakiejś zmiennej z tej lokalizacji pamięci, podczas gdy wskaźnik nadal wskazuje taką lokalizację w pamięci. Taki wskaźnik jest znany jako wskaźnik wiszący, a ten problem jest znany jako problem z wiszącym wskaźnikiem.

Wynik: wartość śmieci

Uwaga: W niektórych kompilatorach może pojawić się komunikat ostrzegawczy zwracający adres zmiennej lokalnej lub tymczasowy

Objaśnienie: zmienna x jest zmienną lokalną. Jego zasięg i czas życia są zawarte w wywołaniu funkcji, stąd po zwróceniu adresu x zmienna x stała się martwa, a wskaźnik nadal wskazuje, ptr nadal wskazuje na tę lokalizację.

Rozwiązanie tego problemu: spraw, aby zmienna x była zmienną statyczną. Innymi słowy, możemy powiedzieć, że wskaźnik, którego obiekt wskazujący został usunięty, jest nazywany wskaźnikiem wiszącym.

Wyciek pamięci

W informatyce wyciek pamięci występuje, gdy program komputerowy nieprawidłowo zarządza alokacjami pamięci. Jak w prostym przypadku, przydzieliliśmy pamięć, a nie Wolny inny termin językowy mówi, że nie zwalniaj go, wyciek pamięci, jest to śmiertelne dla aplikacji i nieoczekiwana awaria.

Peter Parker
źródło
3

Wskaźnik pomaga utworzyć zakres zdefiniowany przez użytkownika dla zmiennej, która jest nazywana zmienną dynamiczną. Zmienna dynamiczna może być pojedynczą zmienną lub grupą zmiennych tego samego typu ( array) lub grupą zmiennych różnych typów ( struct). Domyślny zakres zmiennej lokalnej rozpoczyna się, gdy sterowanie wchodzi do funkcji i kończy się, gdy sterowanie wychodzi z tej funkcji. Domyślny globalny zakres zmienny zaczyna się w momencie wykonania programu i kończy się po zakończeniu programu.

Ale zakres dynamicznej zmiennej, która jest trzymana przez wskaźnik, może rozpoczynać się i kończyć w dowolnym momencie wykonywania programu, o czym decyduje programista. Zawieszanie i wyciek pamięci pojawiają się tylko wtedy, gdy programista nie poradzi sobie z końcem zakresu.

Wyciek pamięci nastąpi, jeśli programista nie napisze kodu ( freewskaźnika) dla końca zakresu dla zmiennych dynamicznych. W każdym razie, gdy program wyjdzie, cała pamięć procesu zostanie zwolniona, w tym czasie ta wyciekająca pamięć również zostanie zwolniona. Ale spowoduje to bardzo poważny problem dla procesu, który trwa długo.

Gdy zakres zmiennej dynamicznej dobiegnie końca (zostanie zwolniony), NULLnależy go przypisać do zmiennej wskaźnikowej. W przeciwnym razie, jeśli kod nieprawidłowo uzyska dostęp do niego, nastąpi niezdefiniowane zachowanie. Tak więc wiszący wskaźnik jest niczym innym jak wskaźnikiem wskazującym dynamiczną zmienną, której zakres jest już zakończony.

rashok
źródło
3

Wyciek pamięci : gdy w stercie znajduje się obszar pamięci, ale w stosie nie ma zmiennej wskazującej na tę pamięć.

Dangling pointer : Gdy zmienna wskaźnika w stosie, ale nie ma pamięci w stercie.

Wiszący wskaźnik próbujący wyłuskać odwołanie bez przydzielania miejsca spowoduje błąd segmentacji.

user2264571
źródło
3
Twój przykład wiszącego wskaźnika nie jest w rzeczywistości wiszącym wskaźnikiem, ale wskaźnikiem NULL. Prawidłowym przykładem byłoby dynamiczne przypisanie pamięci do wskaźnika, powiedzmy za pomocą funkcji malloc (), a następnie zwolnienie () tej pamięci, co czyni ją wiszącym wskaźnikiem. UWAGA: po zwolnieniu nie przypisaliśmy go do wartości NULL, więc wskaźnik nadal wskazuje na ten sam adres pamięci, co czyni go wskaźnikiem wiszącym. Teraz, jeśli spróbujesz uzyskać dostęp do tej pamięci za pomocą tego samego wskaźnika (tj. Wyłuskiwania wskaźnika), możesz zakończyć otrzymywanie błędu segmentacji.
sactiw
0

Wskaźnik wskazujący na lokalizację pamięci, która została usunięta (lub zwolniona) jest nazywana wskaźnikiem wiszącym.

po więcej informacji kliknij TUTAJ

Niravdas
źródło
0

Wskaźnik wskazujący na lokalizację pamięci, która została usunięta (lub zwolniona) jest nazywana wskaźnikiem wiszącym. Istnieją trzy różne sposoby, w jakie Wskaźnik działa jako wskaźnik wiszący.

  1. Usunięcie alokacji pamięci
  2. Wywołanie funkcji
  3. Zmienna wykracza poza zakres

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

Lalit
źródło