I dynamisk tildeling er et minneområde med en viss størrelse reservert ved kjøretid for eksklusiv bruk av prosessen som tildeler den.
C -språket har flere komplementære funksjoner for dynamisk minnestyring. De mest implementerte er malloc (), realloc () og gratis () som er en del av standardbiblioteket og er definert i “stdlib.h ”header. Disse tre funksjonene tildeler minnet til en prosess, endrer størrelsen og frigjør det igjen.
I programmering er det veldig viktig å strengt administrere det dynamiske minnet fordi hver gang vi tildeler ressursene til et program, tar vi dem bort fra operativsystemet. Feilstyring av dynamisk minne kan ha katastrofale konsekvenser for prosessene som kjøres i systemet på den tiden.
I denne Linux -hint -artikkelen lærer du hvordan du bruker gratis () -funksjonen som er en av de tre grunnleggende funksjonene som C -språket gir for dynamisk minnestyring som frigjør de tildelte ressursene og returnerer dem til operativsystemet for gjenbruk.
Vi viser deg syntaksen og beskrivelsen av hvordan det fungerer, inngangsargumentet og datatypen som gjør det opp. Deretter vil vi implementere bruken av gratis () -funksjonen i praktiske eksempler med kodebiter og bilder som viser bruken av den og dens virkning på systemet.
Syntaks av gratis () -funksjonen på C -språk
void Free (void *ptr);
Beskrivelse av gratis () -funksjonen på C -språk
Free () -funksjonen frigjør en spesifisert mengde dynamisk tildelt minne.
Det dynamiske minnet tildeles ved å kalle Malloc () -funksjonen og spesifisere størrelsen i byte i området du vil tildele i inngangsargumentet. Som et resultat returnerer denne funksjonen "PTR" -pekeren som peker på det nylig tildelte området.
Free () -funksjonen frigjør det reserverte minneområdet som omtales av "PTR" i dets enkelt inngangsargument og returnerer tilgjengeligheten til OS. Denne funksjonen returnerer ingen resultater og har ingen feildefinisjon i “Errno.h ” Overskrift.
Free () -funksjonen er en del av standardbiblioteket og er definert i “Stdlib.h ” Overskrift. For å bruke den og de andre dynamiske minnestyringsfunksjonene, må du ta med denne overskriften i koden din som følger:
#inkludere
Hvordan frigjøre det dynamisk tildelte minnet ved hjelp av gratis () -funksjonen
I dette eksemplet lager vi en veldig enkel konsollapplikasjon som gir oss kontroll over å fordele minnet med Malloc () -funksjonen og frigjøre minnet med Free () -funksjonen. Vi samler deretter koden og kjører applikasjonen, overvåker systemet og observerer effekten.
For å lage konsollapplikasjonen inkluderer vi først de nødvendige overskriftene og åpner en hovedfunksjon () med en tom retur. Vi erklærer “PTR” -pekeren i den som brukes i Malloc () og Free () -funksjonene for pekerne til de tildelte minneområdene. Vi erklærer også heltallstørrelsen som bestemmer størrelsen på det tildelte minnet, og heltallalternativet som er betingelsen for bryteren som vi bruker for å velge menyalternativet.
Når de nødvendige variablene er erklært, viser applikasjonen PID -en ved hjelp av printf () og getPid () -funksjonene. Deretter går programmet inn i en uendelig sløyfe der det viser en meny med to alternativer. Det brukervalgte elementet blir hentet ved hjelp av Scanf () -funksjonen i heltallalternativet og er betingelsen for en bryter med to tilfeller, ett for hvert alternativ.
Alternativet 1 kaller Malloc () -funksjonen som tildeler en 122 MB minneblokk til prosessen. Mens alternativet 2 frigjør den blokkeringen ved å kalle gratis () -funksjonen. Du kan se den komplette koden til denne applikasjonen i følgende illustrasjon:
#inkludere
#inkludere
#inkludere
#inkludere
tomrom ()
int -alternativ;
char *ptr;
int -størrelse = 64000000;
printf ("\ nprocess id: %i \ n", getpid ());
mens (1)
printf ("\ n [1] tildel minne.\ n [2] Løsne minnet.\ n ");
scanf ("%i", & alternativ);
bryter (alternativ)
Sak 1:
printf ("\ nallocating memory ... \ n");
Ptr = malloc (størrelse*størrelse av (røye));
gå i stykker;
sak 2:
printf ("\ nreleasing minne… \ n");
gratis (PTR);
gå i stykker;
// sluttbryter
// slutt mens (1)
Merk at i tilfelle 1, tildeler Malloc () -funksjonen et minneområde med størrelse og returnerer “PTR” -pekeren. I sak 2 bruker Free () -funksjonen den samme pekeren som inngangsargument for å frigjøre det tildelte minnet.
For å se effekten av disse to funksjonene på systemet, må vi åpne to kommandokonsoller. I terminal 1 kjører vi toppkommandoen for å se ressursene som brukes av hver systemprosess. I terminal 2 samler vi og kjører applikasjonen som vi nettopp så.
Når applikasjonen kjører, ser vi på konsollen 1 for ressursene som brukes av prosessen hvis PID vises i konsoll 2.
Som vi kan se på figuren, tildelte systemet PID -nummer 13009 til prosessen. Vi kan se i kolonne 10 i venstre terminal at applikasjonen vår bruker mindre enn 0.1% av systemminnet.
Hvis vi velger alternativ 1 i applikasjonen vår og trykker på "Enter", tildeler Malloc () -funksjonen 122 MB minne til prosessen.
Som vi kan se på dette bildet, er minnet som brukes av applikasjonen vår nå 3.6% av det totale minnet som er tilgjengelig i systemet.
Nå velger vi alternativ 2 i applikasjonen vår som kaller gratis () -funksjonen, og passerer “PTR” -pekeren som et inngangsargument. Denne handlingen frigjør minnet som er tildelt av Malloc () -funksjonen i alternativ 1.
I dette bildet kan vi se hvordan gratis () -funksjonen frigjorde det tildelte minnet fra 3.6% til 0.1% av det totale systemet som brukes av vår applikasjon.
Konklusjon
I denne Linux -hint -artikkelen viste vi deg hvordan du bruker gratis () -funksjonen for å frigjøre det dynamisk tildelte minnet. Vi så på syntaks for denne funksjonen og den teoretiske beskrivelsen av hvordan den fungerer.
Deretter brukte vi det vi lærte i et praktisk eksempel med kodebiter og bilder der vi opprettet en konsollapplikasjon som kontrollerer samtalen til Malloc () og Free () -funksjonene. Vi kjørte det trinn for trinn og overvåket systemet for å se effekten av å kalle funksjonene for å tildele og frigjøre systemminnet.