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ú!
|