8. Dynamické premenné

8.4 Pozor na chyby!

Ak p už ukazuje na istú dynamickú premennú (nech je napr. typu int) a táto nie je sprístupnená aj nejakým iným ukazovateľom, tak po vykonaní príkazu
 
p = (int*)malloc(sizeof(int));
 
vznikne situácia ako na obrázku. S premennou, na ktorú pointer p pôvodne ukazoval, už nemôžeme pracovať – nezanikla, ale zostáva „visieť“ niekde v pamäti a už sa k nej nedostaneme (bez pointera nemáme ako 🙂)



Použitím funkcie free dynamická premenná, na ktorú príslušný pointer ukazoval, zanikne, hodnota pointeru sa ale nezmení! To znamená, že pointer stále ukazuje na to isté miesto v pamäti. S touto pamäťou sa dá teda ďalej pracovať, hoci v skutočnosti už programu nepatrí!
 
Pozrime sa na obrázok, ktorý znázorňuje situáciu pred a po volaní funkcie
 
free((void*)p);
 

 
p ukazuje na neexistujúcu premennú! Aby sme predišli prípadnej chybe, po zrušení dynamickej premennej pointeru priradíme hodnotu NULL.

Funkciu free je vhodné volať len v prípade, keď v celom progame nie je využívaná ďalšia premenná (statická či dynamická), ktorá by sprístupňovala rovnakú dynamickú premennú ako pointer p. Správnosť volania z tohto hľadiska sa obvykle nekontroluje a prípadné použitie ukazovateľa na neexistujúcu premennú vedie k chybe programu.
 
Ak pointery p a q ukazujú na tú istú dynamickú premennú, tak po príkazoch
 
free((void*)p);
p = NULL;

 
vznikne nasledovná situácia:

Premenná, na ktorú oba pointery ukazovali zanikla, p neukazuje nikam, q však ukazuje na neexistujúcu premennú!