Kaj je zbirka smeti C ++?

Zbiranje smeti je tehnika upravljanja spomina. Gre za ločen način samodejnega upravljanja pomnilnika, ki se uporablja v programskih jezikih, kjer ročnega upravljanja pomnilnika ni priporočljivo ali izvedeno. V načinu ročnega upravljanja pomnilnika mora uporabnik omeniti pomnilnik, ki je v uporabi in ga je mogoče locirati, medtem ko zbiralnik smeti zbira pomnilnik, ki ga zasedajo spremenljivke ali predmeti, ki jih program ne uporablja več. Zbiralci smeti bodo upravljali samo s pomnilnikom, drugih virov, kot so uničevalci, okno za interakcijo z uporabnikom ali datoteke, pa zbiralec smeti ne bo obravnaval.

Nekaj ​​jezikov potrebuje jezik za zbiranje smeti kot del jezika za dobro učinkovitost. Ti jeziki se imenujejo kot zbrani smeti. Na primer, Java, C # in večina skriptnih jezikov potrebuje zbirko smeti kot del svojega delovanja. Medtem ko jeziki, kot sta C in C ++, podpirajo ročno upravljanje pomnilnika, ki deluje podobno kot zbiralnik smeti. Malo je jezikov, ki podpirajo tako zbiranje smeti kot ročno upravljanje dodeljevanja / prenosa pomnilnika in v takšnih primerih bo zbiralniku smeti in ročnemu pomnilniku dodeljen ločen kup pomnilnika.

Nekatere hrošče lahko preprečimo, če uporabimo način odvoza smeti. Kot naprimer:

  • težava kazalca s kazalcem, pri katerem je poudarjen pomnilnik že razvrščen, medtem ko kazalec še vedno ostane in kaže na različne prerazporejene podatke ali že izbrisani pomnilnik
  • težava, ki se pojavi, ko poskušamo drugič izbrisati ali prestaviti pomnilnik, ki je bil že izbrisan ali premeščen na nek drug predmet
  • odstranjuje težave ali napake, povezane s strukturo podatkov, in omogoča pomnilnik in podatke učinkovito
  • se lahko izognete puščanju pomnilnika ali težavi izčrpavanja spomina

Oglejmo si podrobno razumevanje ročnega upravljanja pomnilnika v primerjavi z zbiranjem smeti, prednosti, slabosti in kako se izvaja v C ++.

Ročno upravljanje pomnilnika

Ko prenehamo uporabljati ta pomnilnik, je treba sprostiti dinamično dodeljeni pomnilnik med časom iz kopice. Dinamično dodeljeni pomnilnik vzame spomin iz kopice, ki je brezplačna shramba pomnilnika.

V C ++ se ta razporeditev pomnilnika in premestitev pomnilnika izvedeta ročno z uporabo ukazov, kot je novo, izbriši. Uporaba "novega" pomnilnika se dodeli iz kopice. Po uporabi je treba ta pomnilnik izbrisati z ukazom 'delete'.

Vsako dodelitev pomnilnika z "novo" je treba končati z ukazom "Delete". Če ne, nam ne bo ostalo v spominu.

Če želite to jasno pokazati s primerom:

n = nov vzorec_objekt;
Uporaba ******* se izvaja tukaj *******
izbrisati n;

Kot je prikazano, se mora vsak nov končati z ukazom brisanja ali nagniti k njemu. Tu se n kazalcu dodeli pomnilnik z ukazom 'new' in je sklican ali usmerjen na predmet, imenovan 'sample_object'. Ko je uporaba in delovanje kazalca končana, bi morali sprostiti ali osvoboditi pomnilnik z ukazom 'delete', kot je bilo storjeno zgoraj.

Toda v primeru zbiranja smeti se pomnilnik dodeli z ukazom 'new', vendar ga ni treba ročno sprostiti s pomočjo 'delete'. V takšnih primerih zbiralnik smeti občasno preverja, ali ima prosti pomnilnik. Kadar košček spomina ne usmeri noben predmet, ga očisti ali sprosti pomnilnik, kar ustvari več prostega prostora za kopico.

Prednosti in slabosti ročnega upravljanja pomnilnika

Prednosti ročnega upravljanja pomnilnika so, da bi imel uporabnik popoln nadzor nad dodeljevanjem in premeščanjem operacij ter tudi vedel, kdaj je dodeljen nov pomnilnik in kdaj je premeščen ali sproščen. Toda če gre za odvoz smeti, na povsem isti primer, ko pomnilnik ne bo sproščen, se sprosti, ko se med občasnim delovanjem sreča.

Tudi v primeru ročnega upravljanja pomnilnika bo destruktor poklican v istem trenutku, ko pokličemo ukaz 'delete'. Toda v primeru zbiranja smeti, ki se ne izvaja.

Obstaja nekaj težav, povezanih z uporabo ročnega upravljanja pomnilnika. Včasih se lahko dvakrat izbrišemo zasedenega spomina. Ko izbrišemo že izbrisani kazalec ali pomnilnik, obstaja možnost, da se kazalec sklicuje na nekatere druge podatke in da jih je mogoče uporabiti.

Druga težava, ki jo imamo pri ročnem upravljanju pomnilnika, je, če med izvajanjem ali uporabo novega dodeljenega kazalca pomnilnika dobimo izjemo, bo izstopila iz zaporedja 'novo' in 'izbris' in operacija sproščanja ne bo izvedeno. Prav tako lahko pride do težav s puščanjem spomina.

Prednosti in slabosti zbiralnika smeti

Glavna pomanjkljivost zbiranja smeti je vključeni čas ali vključeni CPU cikli za iskanje neporabljenega pomnilnika in njegovo brisanje, tudi če uporabnik ve, kateri pomnilnik kazalca se lahko sprosti in ne uporablja. Druga pomanjkljivost je, da ne bomo vedeli časa, ko se briše, niti kdaj pokliče destruktor.

Algoritem zbiranja smeti

Obstaja veliko algoritmov za odvoz smeti, kot so štetje referenc, označevanje in pomikanje, kopiranje itd. Oglejmo si en algoritem podrobneje za boljše razumevanje. Na primer, ko vidimo algoritem štetja referenc, bo imel vsak dinamični pomnilnik referenčno število. Ko se ustvari referenca, se bo referenčno število povečalo in vsakič, ko je referenca izbrisana, se referenčno število zmanjša. Ko referenčno število postane nič, kaže, da je pomnilnik neuporabljen in ga je mogoče sprostiti.

Ta algoritem je mogoče izvajati v C ++ z uporabo posebne vrste kazalca. Treba je prijaviti določeno vrsto kazalca, ki jo je mogoče uporabiti za namene, kot je sledenje vseh ustvarjenih referenc, spremljanje referenčnega štetja, ko se ustvari in izbriše referenca. Program C ++ lahko vsebuje ročno upravljanje pomnilnika in zbiranje smeti v istem programu. Glede na potrebe je mogoče uporabiti običajen kazalec ali specifičen kazalec zbiralca smeti.

Če povzamemo, je zbiranje smeti metoda, ki je nasprotna ročnemu upravljanju spomina. V zbiralniku smeti se pomnilnik sprosti samodejno na podlagi občasnih časovnih pogojev ali na podlagi določenih meril, ki pove, če ga ni več v uporabi. Obe metodi imata svoje prednosti in slabosti. To je mogoče izvajati in uporabljati glede na zapletenost funkcije, odvisno od uporabljenega jezika in njegovega obsega.

Priporočeni članki

To je vodnik za zbiranje smeti C ++. Tukaj razpravljamo o ročnem upravljanju pomnilnika in algoritmu za odvoz smeti, skupaj s prednostmi in slabostmi. Če želite izvedeti več, lahko preberete tudi druge naše predlagane članke -

  1. Konstruktor in Destruktor na Javi
  2. Funkcije niza C ++
  3. Destruktor na Javi
  4. Uporaba C ++ v realnem svetu
  5. 11 najboljših lastnosti in prednosti C ++