On Thu, 28 Feb 2019 at 01:51, Ionuț Mihalache via so
<[email protected]> wrote:
>
> Salut,
>
> În enunț scrie că dacă funcțiile de alocare de memorie eșuează se va propaga
> codul de eroare 12 până la ieșirea din program. Nu ar fi mai bine să se iasă
> din funcția din care nu s-a efectuat cu succes alocarea de memorie folosind
> exit(COD_EROARE). Adică programul oricum nu mai are cum să continue dacă nu
> s-a alocat memorie pentru o variabilă pe care o utilizează.
Salut Ionut,
Ecuatia e simpla in ce priveste testarea la tema: daca faci exit(12)
testele care forteaza "faulty"-malloc iti vor trece, deci poti face
asa. In general limbajele high-level sau platformele "mai evoluate"
SO-ul face cleanup pentru tine, dar e mai bine sa poti controla tu. In
multe cazuri abordarea ta ar fi OK.
Enuntul descrie o abordare mai "paranoica" de care as vrea sa stiti si
anume: verifici pe parcursul programului valoarea de retur si incerci
sa "cureti" resursele deschise pana atunci, exemplu de "flow":
malloc(v1)
malloc(v2)
fopen(file)
malloc(v3)
realloc(v2)
malloc(vector)
fclose(file)
free(vector)
Sa zicem ca realloc pica. Daca faci exit(12) nu se va mai apela
fclose. O abordare clean ar fi if (realloc_fails) { close(ce mai am
deschis), free(ce mai am deschis), return 12; }
Exit sau DIE il faci in acel punct al programului in care chiar nu mai
poti sa continui, cum e scenariul de mai sus de la mine if (realloc
fails) { flcose(file); free(vector); return 12; } - deci executia
programului o puteai continua.
Alt exemplu de scenariu (nu e specificat in enunt, ca e prea
corner-case pentru anul 3): cand faci 22 de insert-uri in coada de
prioritati sa zicem, la al 21-lea alocarea de memorie pica (conditiile
de sistem ale acelui moment: no more virtual addresses, whatever) dar
la al 22-lea insert merge. Daca faceai exit(12) ratai al 22-lea insert
--
Cu stimă,
Mihai Bărbulescu
_______________________________________________
http://ocw.cs.pub.ro/courses/so/info/lista-discutii