[ ljube @ 03.08.2008. 20:14 ] @
Primjer ispod je jedan cirkularni bafer koji pravi do 2048 dinamickih alokacija memorije. Ako se zauzme svih 2048 pointera, ponovo se vraca na 0 i cisti/alocira novu memnoriju.

Code:

char *DYN_TmpStr (size_t Bites)
{
  static int   StrCnt;
  static char *StrFunc[2048];
  StrCnt=(StrCnt + 1) & 2047;
  if(StrFunc[StrCnt]) free (StrFunc[StrCnt]);
  return StrFunc[StrCnt]=(char*)calloc(Bites+128,sizeof(char));
}




Problem je sto sam ja mislio da svaki poziv calloc zahtijeva i free.
Rekli su mi da ne mora, i da ce sam OS da ocisti memoriju kada se program prekine.

Da li je ovo tacno ili se radi o mem leak?

[ Aleksandar Ružičić @ 03.08.2008. 20:53 ] @
pa tacno je da ce OS da oslobodi svu memoriju koju je tvoj program koristio, ali ako ti neki deo memorije koju si alocirao vise ne treba onda treba da je oslobodis, jer ce u suprotnom taj deo memorije biti neupotrebljiv dok se tvoj program ne zatvori.

recimo da programiras neku igru, i na pocetku svakog nivoa ucitas sve potrebne podatke (slike/zvuke/itd) ukoliko na kraju prvog nivoa ne oslobodis memoriju koju si alocirao za taj nivo (slike, muzika, itd) sva ta memorija ce ostati neupotrebljiva sve dok se ne izadje iz igre. zamisli sta ce se desiti na recimo 1000om nivou...

znaci svaki malloc/calloc treba da ima odgovarajuci free.


a sto se tice ovog tvog koda, koliko vidim lici na implementaciju string tipa. moj predlog ti je da pogledas bstring biblioteku: http://bstring.sourceforge.net/
[ ljube @ 04.08.2008. 06:07 ] @
Hvala na odgovoru.

Ovo nije moja funkcija vec sam je koristio samo kao primjer.

Ucinilo mi se da pravi mem leak, ali ako na kraju rada programa OS oslobadja svu memoriju alociranu sa calloc, onda je to OK.

Ja sam mislio da svaki calloc mora da ima free i mislim da sam to uvijek i koristio.

[ Aleksandar Ružičić @ 04.08.2008. 13:19 ] @
Citat:
ljube: Ja sam mislio da svaki calloc mora da ima free i mislim da sam to uvijek i koristio.


veruj mi, tako je najpametnije. svako dinamicko alociranje memorije treba da ima odgovarajuc poziv free fji, tako je to u jezicima koji nemaju GC, a C nema (ugradjen) garbage collector...
[ Eurora3D Team @ 06.08.2008. 18:35 ] @
Cisto da dodam vezano za virtuelnu memoriju jer sam par puta video slicno pitanje...
Kad operativni sistem (odnosi se na windows jer nisam upucen u ostale) kreira proces (izvrsavanje instance programa) on mu dodeljuje jednu kolicinu virtuelne memorije (2GB raspolozivo na win32) sa kojom program radi (adresirana je od 0 pa navise).
Kad se program zavrsi (proces je ukinut) windows oslobadja njegovu viruelnu memoriju.
Ova memorija se zove virtuelna zato sto nije stvarno rezervisana u celini (nedovoljno rama itd. itd.) ali je svakom procesu omoguceno da koristi toliko ako je potrebno (alocira se diamicki pod kontrolom win memory managementa).
Zakljucak, ne treba brinuti o memoriji posle kraja programa i nije to curenje memorije , ali treba brinuti u toku rada (pogotovo ako je neki program koji treba da radi 24/7) jer u suprotnom ostacemo bez slobodne memorije i izvrsavanje programa ce morati da se prekine.
Ovo curenje je narocito ocigledno kad se nova memorija alocira ciklicno u kratkim intervalima (a ne oslobadja se pravilno) i moze da se vidi npr. u win Task Manager-u