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