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