Hva er C ++ søppelinnsamling?

Søppelinnsamling er en minnehåndteringsteknikk. Det er en egen automatisk minnestyringsmetode som brukes i programmeringsspråk der manuell minnestyring ikke foretrekkes eller gjøres. I den manuelle minnestyringsmetoden kreves det at brukeren nevner minnet som er i bruk og som kan omplasseres, mens søppelsamleren samler minnet som er opptatt av variabler eller objekter som ikke er mer i bruk i programmet. Bare minne blir administrert av søppeloppsamlere, andre ressurser som destruktører, brukerinteraksjonsvindu eller filer vil ikke bli håndtert av søppelsamleren.

Få språk trenger søppelsamlere som en del av språket for god effektivitet. Disse språkene kalles som søppelinnsamlede språk. For eksempel trenger Java, C # og de fleste skriptspråk søppelhenting som en del av deres funksjon. Mens språk som C og C ++ støtter manuell minneadministrasjon som fungerer på samme måte som søppeloppsamleren. Det er få språk som støtter både søppelinnsamling og manuelt administrert minnetildeling / fordeling, og i slike tilfeller vil en egen haug med masse bli tildelt søppeloppsamleren og manuelt minne.

Noen av feilene kan forhindres når søppelinnsamlingsmetoden brukes. Som for eksempel:

  • dinglende pekerproblem der minnet som er pekt allerede er omplassert mens pekeren fremdeles er igjen og peker på forskjellige tilordnede data eller allerede slettet minne
  • problemet som oppstår når vi prøver å slette eller omfordele minnet en gang til som allerede er blitt slettet eller omfordelt til et annet objekt
  • fjerner problemer eller feil tilknyttet datastrukturer og gjør minnet og datahåndteringen effektivt
  • minnelekkasjer eller problemer med minneutmattelse kan unngås

La oss se en detaljert forståelse av manuell minnestyring kontra søppelinnsamling, fordeler, ulemper og hvordan det implementeres i C ++.

Manuell minnestyring

Dynamisk tildelt minne i løpet av kjøretiden fra haugen må frigjøres når vi slutter å bruke det minnet. Dynamisk allokert minne tar minne fra haugen, som er en gratis lagring av minne.

I C ++ gjøres denne minnetildelingen og avdelingen manuelt ved hjelp av kommandoer som nye, slette. Å bruke 'nytt' minne blir tildelt fra dyngen. Etter bruk, må dette minnet tømmes ved hjelp av 'slett' -kommandoen.

Hver minnetildeling med 'ny' må fullføres med en 'slett'-kommando. Hvis ikke vil vi gå ut av minnet.

For å vise det tydelig med et eksempel:

n = nytt eksempel_objekt;
******* bruk implementeres her *******
slette n;

Som vist skal hvert nytt slutte eller skråstilles med en slettekommando. Her blir n pekeren tildelt minne ved hjelp av 'ny' kommando og blir henvist til eller pekt til et objekt som heter 'sample_object'. Når bruken og funksjonen til pekeren er fullført, bør vi frigjøre eller frigjøre minnet ved hjelp av 'slett' -kommandoen som gjort ovenfor.

Men i tilfelle søppelhenting, blir minnet tildelt ved hjelp av 'ny' kommando, men det trenger ikke å slippes manuelt ved å bruke 'slett'. I slike tilfeller løper søppleoppsamleren jevnlig etter ledig minne. Når et stykke minne ikke pekes på noe objekt, tømmer eller slipper det minnet og skaper mer ledig haugplass.

Fordeler og ulemper ved manuell minnestyring

Fordelene med manuell minnestyring er at brukeren vil ha fullstendig kontroll over både tildelings- og omfordelingsoperasjoner og også vite når et nytt minne blir tildelt og når det er omplassert eller utgitt. Men når det gjelder innsamling av søppel, i nøyaktig samme tilfelle etter at minnet ikke blir brukt, vil det bli frigitt når det møter det under den periodiske operasjonen.

Også når det gjelder manuell minnestyring, vil destruktoren bli kalt i samme øyeblikk når vi kaller 'slett' -kommandoen. Men i tilfelle søppeloppsamler som ikke blir implementert.

Det er noen få problemer knyttet til bruk av manuell minnestyring. Noen ganger kan vi ha en tendens til å dobbel slette minnet som er okkupert. Når vi sletter den allerede slettede pekeren eller minnet, er det stor sjanse for at pekeren kan henvise til andre data og kan være i bruk.

Et annet problem som vi har innen manuell minnestyring er, hvis vi får et unntak under utførelsen eller bruken av den nye minnetilordnede pekeren, vil den gå ut av sekvensen til 'nytt' og 'slette' og utgivelsesoperasjonen vil ikke være utført. Det kan også være problemer med minnelekkasje.

Fordeler og ulemper med Garbage Collector

En stor ulempe med søppelsamlingen er tiden det gjelder eller CPU-sykluser det dreier seg om å finne det ubrukte minnet og slette det, selv om brukeren vet hvilket pekerminne som kan frigis og ikke brukes. En annen ulempe er at vi ikke vil vite tidspunktet da det blir slettet og heller ikke når ødeleggeren blir kalt.

Søppelinnsamlingsalgoritme

Det er mange søppelinnsamlingsalgoritmer som referansetelling, merke og feiing, kopiering, osv. La oss se en algoritme i detalj for bedre forståelse. Når vi for eksempel ser referansetellingalgoritmen, vil hvert dynamisk minne ha en referansetelling. Når det opprettes en referanse, øker referansetallet, og når en referanse blir slettet, blir referansetallet redusert. Når referansetallet blir null, viser det at minnet er ubrukt og kan frigjøres.

Denne algoritmen kan implementeres i C ++ ved bruk av en bestemt pekertype. En spesifikk pekertype bør deklareres, og denne kan brukes til formål som å følge med på alle referanser som er opprettet, holde oversikt over referansetallet når referanse opprettes og slettes. Et C ++ -program kan inneholde både manuell minnestyring og søppelinnsamling som skjer i samme program. Etter behov kan enten den vanlige pekeren eller den spesifikke søppelsamlerpekeren brukes.

For å oppsummere er søppelsamlingen altså en metode motsatt av manuell minnestyring. I en søppeloppsamler frigjøres minnet automatisk basert på periodisk tidsbasis eller basert på spesifikke kriterier som forteller om det ikke er mer i bruk. Begge metodene har sine egne fordeler og ulemper. Dette kan implementeres og brukes i henhold til funksjonens kompleksitet, avhengig av språket som brukes og omfanget av det.

Anbefalte artikler

Dette er en guide til C ++ Garbage Collection. Her diskuterer vi manuell minnehåndtering og søppelinnsamlingsalgoritmen sammen med fordeler og ulemper. Du kan også gå gjennom andre foreslåtte artikler for å lære mer -

  1. Konstruktør og Destructor i Java
  2. C ++ strengfunksjoner
  3. Destructor i Java
  4. Bruksområder for C ++ i Real World
  5. Topp 11 funksjoner og fordeler med C ++