Što je skupljanje smeća C ++?

Skupljanje smeća je tehnika upravljanja pamćenjem. To je zasebna metoda automatskog upravljanja memorijom koja se koristi u programskim jezicima gdje se ne preferira ili ne vrši ručno upravljanje memorijom. U metodi ručnog upravljanja memorijom korisnik mora spomenuti memoriju koja se koristi i koja se može premjestiti, dok sakupljač smeća skuplja memoriju koju zauzimaju varijable ili objekti koji se više ne koriste u programu. Skupljači smeća upravljaju samo memorijom, drugim resursima kao što su destruktori, prozorom interakcije korisnika ili datotekama neće se baviti skupljačem smeća.

Malobrojni jezici trebaju sakupljače smeća kao dio jezika za dobru učinkovitost. Ti se jezici nazivaju jezicima sakupljenim smećem. Na primjer, Java, C # i većina skriptnih jezika treba odvoz smeća kao dio njihovog funkcioniranja. Dok jezici poput C i C ++ podržavaju ručno upravljanje memorijom koje djeluje slično kao sakupljaču smeća. Malo je jezika koji podržavaju i prikupljanje smeća i ručno upravljanje raspodjelom memorije / razmještanjem memorije i u takvim će slučajevima odvojeno hrpa memorije biti dodijeljeno sakupljaču smeća i ručnoj memoriji.

Neke se greške mogu spriječiti ako se koristi metoda odvoza smeća. Kao što su:

  • problem s pomičnim pokazivačem u kojem je istaknuta memorija već raspoređena, dok pokazivač i dalje ostaje i ukazuje na različite preraspoređene podatke ili već izbrisanu memoriju
  • problem koji nastaje kada pokušavamo drugi put izbrisati ili dodijeliti memoriju koja je već izbrisana ili premještena u neki drugi objekt
  • uklanja probleme ili pogreške povezane sa strukturom podataka i čini memoriju i rad s podacima učinkovito
  • mogu se izbjeći curenje memorije ili problem iscrpljenosti memorije

Pogledajmo detaljno razumijevanje ručnog upravljanja memorijom u odnosu na prikupljanje smeća, prednosti, nedostaci i kako se implementira u C ++.

Ručno upravljanje memorijom

Dinamično dodijeljena memorija tijekom vremena izvođenja iz hrpe treba se osloboditi kad prestanemo koristiti tu memoriju. Dinamično dodijeljena memorija uzima memoriju iz gomile, koja je besplatna pohrana memorije.

U C ++ ta se dodjela memorije i razmještanje memorije obavljaju ručno pomoću naredbi kao što su novo, izbriši. Korištenje 'nove' memorije dodjeljuje se iz gomile. Nakon upotrebe, ovo se memorija mora izbrisati pomoću naredbe 'delete'.

Svaka dodjela memorije s "new" mora biti završena naredbom "delete". Ako ne, ostat ćemo u sjećanju.

Da biste to jasno pokazali na primjeru:

n = novi uzorak_objekt;
Ovdje se primjenjuje ******* upotreba *******
izbrisati n;

Kao što je prikazano, svaka nova treba završiti ili se naginjati naredbom za brisanje. Ovdje n pokazivaču dodjeljuje se memorija pomoću naredbe 'new', a upućuje se ili upućuje na objekt zvan 'sample_object'. Nakon dovršetka korištenja i funkcioniranja pokazivača, trebali bismo osloboditi ili osloboditi memoriju pomoću naredbe 'delete' kao što je prethodno učinjeno.

No u slučaju odvoza smeća, memorija se dodjeljuje pomoću naredbe 'new', ali je ne morate ručno otpustiti pomoću 'delete'. U takvim slučajevima, sakupljač smeća pokreće povremeno provjeravajući slobodnu memoriju. Kad komad memorije nije usmjeren nijednim objektom, briše se ili oslobađa memorija stvarajući više slobodnog prostora za hrpu.

Prednosti i nedostaci ručnog upravljanja memorijom

Prednosti ručnog upravljanja memorijom su u tome što će korisnik imati potpunu kontrolu nad raspodjelom i razmještajem operacija te također znati kada je dodijeljena nova memorija i kada je razmještena ili oslobođena. Ali u slučaju sakupljanja smeća, u točno istoj instanci nakon što se memorija neće osloboditi, bit će puštena kada se bude susrela s njom tijekom periodičnog rada.

Također, u slučaju ručnog upravljanja memorijom, destruktor će biti pozvan u istom trenutku kada nazovemo naredbu 'delete'. Ali u slučaju sakupljača smeća koji se ne provodi.

Postoji nekoliko problema povezanih s upotrebom ručnog upravljanja memorijom. Ponekad bismo mogli skloniti dvostruko brisanje zauzete memorije. Kad izbrišemo već izbrisani pokazivač ili memoriju, postoje šanse da se pokazivač može uputiti na neke druge podatke i može se koristiti.

Drugi problem koji imamo pri ručnom upravljanju memorijom je ako dobijemo iznimku tijekom izvođenja ili korištenja novog dodijeljenog pokazivača memorije, on će izaći iz slijeda 'novo' i 'izbrisati' i operacija oslobađanja neće biti izvedena. Također, mogu postojati problemi s curenjem memorije.

Prednosti i nedostaci sakupljača smeća

Jedan glavni nedostatak sakupljanja smeća je uključivanje vremena ili ciklusa CPU-a za pronalaženje neiskorištene memorije i brisanje iste, čak i ako korisnik zna koja memorija pokazivača može biti oslobođena, a ne koristi. Drugi nedostatak je što nećemo znati vrijeme kada se briše niti kada se poziva destruktor.

Algoritam skupljanja smeća

Postoji mnogo algoritama za prikupljanje smeća, kao što su brojanje referenci, označavanje i pomicanje, kopiranje itd. Pogledajmo jedan algoritam u detalje za bolje razumijevanje. Na primjer, kad vidimo algoritam brojanja referenci, svaka dinamička memorija imat će referentno brojanje. Kad se referenca kreira, referentni broj će se povećavati, a kad se briše referenca, broj referenci se smanjuje. Kad broj referentnih vrijednosti postane nula, pokazuje da se memorija ne koristi i može se osloboditi.

Ovaj se algoritam može implementirati u C ++ koristeći određenu vrstu pokazivača. Treba navesti određenu vrstu pokazivača i to se može koristiti u svrhe kao što su praćenje svih stvorenih referenci, praćenje referentnog broja kada se referenca stvori i izbriše. C ++ program može sadržavati i ručno upravljanje memorijom i odvoz smeća koji se događaju u istom programu. Prema potrebi, može se upotrijebiti uobičajeni pokazivač ili specifični pokazivač sakupljača smeća.

Dakle, ukratko, sakupljanje smeća je metoda suprotna ručnom upravljanju memorijom. Memorija se u sakupljaču smeća automatski oslobađa na temelju periodičnog vremena ili na temelju određenih kriterija koji govore da se više ne koristi. Obje metode imaju svoje prednosti i nedostatke. To se može implementirati i koristiti prema složenosti funkcije, ovisno o korištenom jeziku i njegovom opsegu.

Preporučeni članci

Ovo je vodič za prikupljanje smeća C ++. Ovdje smo raspravljali o ručnom upravljanju memorijom i algoritmu za odvoz smeća zajedno s prednostima i nedostacima. Možete i proći naše druge predložene članke da biste saznali više -

  1. Konstruktor i destruktor na Javi
  2. C ++ string-funkcije
  3. Destruktor na Javi
  4. Primjene C ++ u stvarnom svijetu
  5. Top 11 značajki i prednosti C ++

Kategorija: