[so] [Tema1][General] Neclaritate enunt: verificare valori întoarse de funcțiile malloc/calloc/fopen/realloc
Mihai Barbulescu
b12mihai at gmail.com
Thu Feb 28 11:27:23 EET 2019
On Thu, 28 Feb 2019 at 01:51, Ionuț Mihalache via so
<so at cursuri.cs.pub.ro> 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
More information about the so
mailing list