Ovako na prvu loptu, nije mi bas najjasnije sta tacno radis i zasto.
Citat:
RMAN:
Code:
char **aa;
aa=split();
free(aa);
Da li ima smisla ovako raditi free?
Deluje mi prilicno nedisciplinovano.
Predpostavljam da se u tvom kodu radi o sledecem:
ako se desi da u split-ovanom stringu imas N sub-stringova, onda negde u funkciji split()
- prvo alociras memoriju za N pointera na char,
- na svakom od tih pointera alociras memoriju dovoljnu za smestaj konkretnog substring-a (tj. strlen( ) + 1),
- u svaku tako alociranu memoriju kopiras svaki od N substring-ova + terminacioni NULL karakter.
- niz pointera vracas iz funkcije
Ako je to slucaj, onda ti dealokacija nije potpuna. Prvo treba da dealociras memoriju dodeljenu
svakom od N pointera, pa zatim da dealociras memoriju rezervisanu za smestaj pointera. Naravno,
treba da iz funkcije osim char** vratis i N da bi znao koliko puta da odradis dealokaciju.
U ovoj varijanti, zaboravljena/neizvrsena dealokacija sama po sebi nije razlog za crash, nego pre
za memory leak. Mora da posle free( ) radis jos nesto drugo sto ne bi trebalo (tj. pokusavas da koristis
neki od pointera koji jos uvek pokazuje na memoriju koja ti vise ne pripada ili nesto slicno).
Cisto teorije radi (tj. onoga sto omogucava sintaksa), postoji i druga hipoteticka mogucnost - da u
funkciji split() alociras memoriju za jedan jedini pointer na char, i da adresu tog pointera vracas iz funkcije.
U tom slucaju, statement free(aa) ce ti kompajler mozda odobriti, ali je run-time crash neminovan i u
Debug i u Release verziji (ispravno bi bilo free(*aa)). Mirise mi da se u slucaju tvog programa ipak ne
radi o ovome.