close

Visící ukazatel

Přejít na navigaci Přejít na hledání

Visící ukazatel v programovacích jazycích označuje ukazatel , který odkazuje na oblast paměti, která již není platná, protože již byla uvolněna nebo protože ukazatel je používán mimo kontext existence proměnné, na kterou odkazuje. Vzhledem k tomu, že operační systém může znovu přiřadit a znovu použít toto místo v paměti, použití visícího ukazatele přináší nepředvídatelné účinky, od chyby segmentace (systémy UNIX) nebo obecné chyby ochrany (systémy Windows) s následným ukončením aplikace, která chybu způsobila, kvůli poškození dat v paměti. [1]

Některé příčiny visícího ukazatele

V programovacích jazycích, jako je C , které vyžadují, aby se programátor postaral o uvolnění dynamicky alokované paměti, ukazatele, stejně jako všechny ostatní proměnné, nadále obsahují poslední přiřazenou hodnotu, i když tato hodnota není, je platnější. . Když je například paměť, na kterou ukazuje určitý ukazatel, uvolněna, nelze ji dále používat, aniž by byla znovu přiřazena do jiné oblasti paměti.

Příklad je uveden níže:

int * i = ( int * ) malloc ( sizeof ( int ));     

/ * ... * /

volný ( i );

* i = 200 ; / * v tomto okamžiku již hodnota obsažená v i neodkazuje             * na platnou oblast paměti!             * /    


Další příčinou visících ukazatelů, jak již bylo zmíněno, může být použití ukazatele, který odkazuje na proměnnou mimo kontext existence (nebo rozsahu) této proměnné.

Například:

  int * i = NULL ;   

  {
    int cont = 3 ;   

    i = & pokračování ;  

    / * ... * /

    * i = 2 ; / * je ekvivalentní zápisu cont = 2; * /      
  }

  * i = 200 ; / * v tomto bodě cont již není platná proměnná,               * takže i již neodkazuje na platnou oblast paměti!               * /    


Poslední příklad ukazuje další chybu (ve skutečnosti velmi podobnou té předchozí), která často způsobuje problémy s visícími ukazateli, to znamená s návratem na konec funkce, adresu lokální proměnné, již mimo samotnou funkci neplatí:

  int * vrátí UnInt () 
  {
    int cont = 3 ;   

    návrat & pokračování ; / * ukazatel na pokračování není platný mimo tuto funkci! * /   
  }

[2]

Poznámky

  1. ^ Harvey M. Deitel, Paul J. Deitel, C++. Základy programování , Apogeo, 2005.
  2. ^ Paolo Santi, základy programování v C: ukazatele , na wwwold.iit.cnr.it , 22. prosince 2014. Staženo ve 12:45 .