Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

calloc funkcija - da li mora da se pozove free?

[es] :: C/C++ programiranje :: calloc funkcija - da li mora da se pozove free?

[ Pregleda: 2244 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

ljube
Ljubiša Knežević
Banjaluka

Član broj: 22429
Poruke: 158
*.broadband.blic.net.



+2 Profil

icon calloc funkcija - da li mora da se pozove free?03.08.2008. u 20:14 - pre 191 meseci
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?


 
Odgovor na temu

Aleksandar Ružičić
Software Architect, Appricot d.o.o.
Beograd

Član broj: 26939
Poruke: 2881

Jabber: krckoorascic@gmail.com
Sajt: krcko.net


+44 Profil

icon Re: calloc funkcija - da li mora da se pozove free?03.08.2008. u 20:53 - pre 191 meseci
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/
 
Odgovor na temu

ljube
Ljubiša Knežević
Banjaluka

Član broj: 22429
Poruke: 158
*.broadband.blic.net.



+2 Profil

icon Re: calloc funkcija - da li mora da se pozove free?04.08.2008. u 06:07 - pre 191 meseci
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.


 
Odgovor na temu

Aleksandar Ružičić
Software Architect, Appricot d.o.o.
Beograd

Član broj: 26939
Poruke: 2881

Jabber: krckoorascic@gmail.com
Sajt: krcko.net


+44 Profil

icon Re: calloc funkcija - da li mora da se pozove free?04.08.2008. u 13:19 - pre 191 meseci
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...
 
Odgovor na temu

Eurora3D Team
Nebojsa - Programer & Vodja tima
Beograd

Član broj: 120376
Poruke: 900
91.148.112.*



+7 Profil

icon Re: calloc funkcija - da li mora da se pozove free?06.08.2008. u 18:35 - pre 191 meseci
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


 
Odgovor na temu

[es] :: C/C++ programiranje :: calloc funkcija - da li mora da se pozove free?

[ Pregleda: 2244 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.