Ce este colectarea gunoiului C ++?

Colectarea gunoiului este o tehnică de gestionare a memoriei. Este o metodă separată de gestionare automată a memoriei care este folosită în limbajele de programare în care gestionarea manuală a memoriei nu este preferată sau făcută. În metoda de gestionare a memoriei manuale, utilizatorul trebuie să menționeze memoria care este folosită și care poate fi alocată, în timp ce colectorul de gunoi colectează memoria care este ocupată de variabile sau obiecte care nu mai sunt utilizate în program. Doar memoria va fi gestionată de către colectoarele de gunoi, alte resurse, cum ar fi distrugătoarele, fereastra de interacțiune a utilizatorului sau fișierele nu vor fi gestionate de colectorul de gunoi.

Puține limbi au nevoie de colectoare de gunoi ca parte a limbii pentru o eficiență bună. Aceste limbi sunt numite limbi colectate de gunoi. De exemplu, Java, C # și majoritatea limbajelor de script au nevoie de colectarea gunoiului ca parte a funcționării lor. În timp ce limbi precum C și C ++ acceptă gestionarea manuală a memoriei, care funcționează similar cu colectorul de gunoi. Există puține limbi care acceptă atât colectarea gunoiului, cât și alocarea / delocarea memoriei gestionate manual, iar în astfel de cazuri, o cantitate separată de memorie va fi alocată colectorului de gunoi și memoriei manuale.

Unele dintre erorile pot fi prevenite atunci când se utilizează metoda de colectare a gunoiului. Precum:

  • problemă cu indicatorul în care memoria indicată este deja anulată, în timp ce indicatorul rămâne și indică date reasignate sau memorie deja ștersă
  • problema care apare atunci când încercăm să ștergem sau să redimensionăm a doua oară memoria care a fost deja ștearsă sau realocată la un alt obiect
  • elimină problemele sau erorile asociate cu structurile de date și face memoria și gestionarea eficientă a datelor
  • scurgerile de memorie sau problema epuizării memoriei pot fi evitate

Haideți să vedem o înțelegere detaliată a managementului manual al memoriei vs colectarea gunoiului, avantajele, dezavantajele și modul în care este implementată în C ++.

Managementul manual al memoriei

Memoria alocată dinamic în timpul rulării de la grămadă trebuie eliberată odată ce nu mai folosim acea memorie. Memoria alocată dinamic preia memoria din grămadă, care este un magazin gratuit de memorie.

În C ++ această alocare și deocare a memoriei se fac manual folosind comenzi precum new, delete. Utilizarea memoriei „noi” este alocată din grămadă. După utilizarea sa, această memorie trebuie ștearsă folosind comanda „șterge”.

Fiecare alocare de memorie cu „nou” trebuie finalizată cu o comandă „șterge”. Dacă nu, vom ieși din memorie.

Pentru a arăta clar cu un exemplu:

n = eșantion_obiect nou;
Utilizarea ******* este implementată aici *******
șterge n;

După cum este arătat, fiecare nou ar trebui să se termine sau să înclineze cu o comandă de ștergere. Aici n pointer se alocă memorie folosind comanda „nouă” și se face referire la un obiect numit „sample_object”. Odată finalizată utilizarea și funcționarea indicelui, ar trebui să eliberam sau să eliberam memoria folosind comanda „șterge”, așa cum s-a făcut mai sus.

Dar în cazul colectării gunoiului, memoria este alocată folosind comanda „nouă”, dar nu trebuie eliberată manual folosind „ștergere”. În astfel de cazuri, colectorul de gunoi rulează periodic verificarea memoriei libere. Atunci când o bucată de memorie nu este indicată de niciun obiect, ea șterge sau eliberează memoria creând mai mult spațiu liber.

Avantajele și dezavantajele managementului manual al memoriei

Avantajele managementului manual al memoriei sunt faptul că utilizatorul ar avea un control complet atât asupra alocării, cât și alocării operațiilor și, de asemenea, ar ști când este alocată o nouă memorie și când este alocată sau eliberată. Dar în cazul colectării gunoiului, la aceeași instanță după utilizare, memoria nu va fi eliberată, va fi eliberată atunci când o va întâlni în timpul operației periodice.

De asemenea, în cazul gestionării manuale a memoriei, distrugătorul va fi apelat în același moment în care apelăm comanda „ștergere”. Dar în cazul colectorului de gunoi care nu este implementat.

Există câteva probleme asociate cu utilizarea gestionării manuale a memoriei. Uneori, putem avea tendința de a șterge de două ori memoria ocupată. Când ștergem indicatorul sau memoria deja șterse, există șanse ca indicatorul să facă referire la alte date și să poată fi folosit.

O altă problemă pe care o avem în gestionarea manuală a memoriei este că, dacă obținem o excepție în timpul executării sau utilizării noului indicator alocat pentru memorie, acesta va ieși din secvența „nou” și „șterge”, iar operația de eliberare nu va fi efectuat. De asemenea, pot exista probleme de scurgere a memoriei.

Avantajele și dezavantajele colectorului de gunoi

Un dezavantaj major al colectării gunoiului este timpul implicat sau ciclurile procesorului implicate pentru a găsi memoria neutilizată și ștergerea acesteia, chiar dacă utilizatorul știe ce memorie pointer poate fi eliberată și care nu o poate folosi. Un alt dezavantaj este că nu vom ști momentul în care este șters și nici când este chemat distrugătorul.

Algoritmul colectării gunoiului

Există mai mulți algoritmi de colectare a gunoiului, precum numărarea, marcarea și măturarea, copierea, etc. Să vedem în detaliu un algoritm pentru o mai bună înțelegere. De exemplu, când vedem algoritmul de numărare a referințelor, fiecare memorie dinamică va avea un număr de referință. Când se creează o referință, numărul de referință va crește și de fiecare dată când se șterge o referință, numărul de referință este decrementat. Odată ce numărul de referință devine zero, arată că memoria nu este neutilizată și poate fi eliberată.

Acest algoritm poate fi implementat în C ++ folosind un tip specific de pointer. Un tip specific de pointer ar trebui declarat și acesta poate fi utilizat în scopuri precum urmărirea tuturor referințelor create, urmărirea numărului de referințe atunci când se creează și se șterge. Un program C ++ poate conține atât gestionarea manuală a memoriei, cât și colectarea gunoiului în același program. În funcție de necesitate, poate fi folosit fie indicatorul normal, fie indicatorul de colectare a gunoiului.

Astfel, pentru a rezuma, colectarea gunoiului este o metodă opusă gestionării manuale a memoriei. Într-un colector de gunoi, memoria este eliberată automat în funcție de o perioadă de timp periodică sau pe baza unor criterii specifice care indică dacă nu mai este folosită. Ambele metode au propriile avantaje și dezavantaje. Aceasta poate fi implementată și utilizată în funcție de complexitatea funcției, în funcție de limbajul folosit și de sfera acesteia.

Articole recomandate

Acesta este un ghid pentru colectarea gunoiului C ++. Aici discutăm despre gestionarea manuală a memoriei și algoritmul de colectare a gunoiului, împreună cu avantajele și dezavantajele. Puteți parcurge și alte articole sugerate pentru a afla mai multe -

  1. Constructor și distrugător în Java
  2. Funcții cu șiruri C ++
  3. Distrugător în Java
  4. Aplicații ale C ++ în lumea reală
  5. Top 11 caracteristici și avantaje ale C ++