Wat is C ++ Garbage Collection?

Garbage collection is een techniek voor geheugenbeheer. Het is een afzonderlijke methode voor automatisch geheugenbeheer die wordt gebruikt in programmeertalen waar handmatig geheugenbeheer niet de voorkeur heeft of wordt uitgevoerd. In de handmatige geheugenbeheermethode moet de gebruiker het geheugen vermelden dat in gebruik is en dat kan worden toegewezen, terwijl de vuilnisman het geheugen verzamelt dat wordt ingenomen door variabelen of objecten die niet meer in het programma worden gebruikt. Alleen geheugen wordt beheerd door vuilnismannen, andere bronnen zoals destructors, gebruikersinteractievenster of bestanden worden niet door de vuilnisman behandeld.

Weinig talen hebben vuilnismannen nodig als onderdeel van de taal voor een goede efficiëntie. Deze talen worden als verzamelde talen genoemd. Java, C # en de meeste scripttalen hebben bijvoorbeeld afvalinzameling nodig als onderdeel van hun werking. Terwijl talen zoals C en C ++ handmatig geheugenbeheer ondersteunen dat vergelijkbaar is met de vuilnisman. Er zijn maar weinig talen die zowel garbage collection als handmatig beheerde geheugentoewijzing / deallocatie ondersteunen en in dergelijke gevallen wordt er een aparte heap geheugen toegewezen aan de garbage collector en handmatig geheugen.

Sommige van de bugs kunnen worden voorkomen wanneer de methode voor het verzamelen van afval wordt gebruikt. Zoals:

  • bungelend wijzerprobleem waarbij het puntige geheugen al is toegewezen terwijl de wijzer nog steeds aanwezig is en wijst naar andere opnieuw toegewezen gegevens of reeds gewist geheugen
  • het probleem dat optreedt wanneer we een tweede keer een geheugen proberen te verwijderen of de toewijzing dat al is verwijderd of opnieuw is toegewezen aan een ander object
  • verwijdert problemen of bugs in verband met gegevensstructuren en zorgt voor een efficiënte verwerking van geheugen en gegevens
  • geheugenlekken of geheugenuitputtingsproblemen kunnen worden voorkomen

Laten we eens kijken naar een gedetailleerd begrip van handmatig geheugenbeheer versus het verzamelen van afval, voordelen, nadelen en hoe het wordt geïmplementeerd in C ++.

Handmatig geheugenbeheer

Dynamisch toegewezen geheugen tijdens de uitvoering van de heap moet worden vrijgegeven zodra we stoppen met het gebruik van dat geheugen. Dynamisch toegewezen geheugen haalt geheugen uit de heap, wat een vrije geheugenopslag is.

In C ++ worden deze geheugentoewijzing en deallocatie handmatig uitgevoerd met commando's als nieuw, delete. Het gebruik van 'nieuw' geheugen wordt toegewezen vanuit de heap. Na gebruik moet dit geheugen worden gewist met de opdracht 'verwijderen'.

Elke geheugentoewijzing met 'nieuw' moet worden afgesloten met een opdracht 'verwijderen'. Zo niet, dan raken we uit geheugen.

Om het duidelijk te tonen met een voorbeeld:

n = nieuw sample_object;
******* gebruik wordt hier geïmplementeerd *******
verwijder n;

Zoals getoond, zou elke nieuwe moeten eindigen of hellen met een delete-opdracht. Hier wordt aan de aanwijzer geheugen toegewezen met de opdracht 'new' en wordt verwezen naar of verwezen naar een object met de naam 'sample_object'. Zodra het gebruik en de werking van de aanwijzer zijn voltooid, moeten we het geheugen vrijgeven of vrijmaken met de opdracht 'verwijderen' zoals hierboven is gedaan.

Maar in het geval van afvalophaling wordt het geheugen toegewezen met de opdracht 'nieuw', maar het hoeft niet handmatig te worden vrijgegeven met behulp van 'verwijderen'. In dergelijke gevallen wordt de vuilnisman regelmatig gecontroleerd op vrij geheugen. Wanneer een stukje geheugen door geen enkel object wordt aangewezen, wordt het geheugen gewist of vrijgegeven, waardoor er meer vrije heapruimte ontstaat.

Voor- en nadelen van handmatig geheugenbeheer

Voordelen van handmatig geheugenbeheer zijn dat de gebruiker volledige controle heeft over zowel toewijzings- als de-toewijzingsbewerkingen en ook weet wanneer een nieuw geheugen wordt toegewezen en wanneer het wordt toegewezen of vrijgegeven. Maar in het geval van garbage collection, op exact dezelfde instantie na het gebruik, zal het geheugen niet worden vrijgegeven, het zal worden vrijgegeven wanneer het het tegenkomt tijdens de periodieke bewerking.

Ook in het geval van handmatig geheugenbeheer wordt de destructor aangeroepen op hetzelfde moment dat we het commando 'delete' aanroepen. Maar in het geval van vuilnisman is dat niet geïmplementeerd.

Er zijn een paar problemen met het gebruik van handmatig geheugenbeheer. Soms hebben we de neiging om het bezet geheugen dubbel te verwijderen. Wanneer we de al verwijderde aanwijzer of het geheugen verwijderen, is er een kans dat de aanwijzer naar andere gegevens verwijst en mogelijk in gebruik is.

Een ander probleem dat we hebben bij handmatig geheugenbeheer is dat als we een uitzondering krijgen tijdens de uitvoering of het gebruik van de nieuwe aan geheugen toegewezen aanwijzer, deze uit de reeks van 'nieuw' en 'verwijderen' verdwijnt en de releasebewerking niet uitgevoerd. Er kunnen ook problemen zijn met geheugenlekken.

Voor- en nadelen van Garbage Collector

Een groot nadeel van het verzamelen van afval is de tijd of CPU-cycli die nodig zijn om het ongebruikte geheugen te vinden en te verwijderen, zelfs als de gebruiker weet welk pointergeheugen kan worden vrijgegeven en niet in gebruik is. Een ander nadeel is dat we niet weten wanneer het wordt verwijderd of wanneer de destructor wordt aangeroepen.

Garbage Collection Algorithm

Er zijn veel algoritmen voor het verzamelen van afval, zoals het tellen van referenties, markeren en vegen, kopiëren, enz. Laten we één algoritme in detail bekijken voor een beter begrip. Als we bijvoorbeeld het algoritme voor referentietelling zien, heeft elk dynamisch geheugen een referentietelling. Wanneer een referentie wordt gemaakt, neemt het aantal referenties toe en telkens wanneer een referentie wordt verwijderd, neemt het aantal referenties af. Zodra de referentietelling nul wordt, geeft dit aan dat het geheugen ongebruikt is en kan worden vrijgegeven.

Dit algoritme kan worden geïmplementeerd in C ++ met behulp van een specifiek type aanwijzer. Een specifiek pointertype moet worden aangegeven en dit kan worden gebruikt voor doeleinden zoals het bijhouden van alle gemaakte referenties, het bijhouden van de referentietelling wanneer referentie wordt gemaakt en verwijderd. Een C ++ -programma kan zowel handmatig geheugenbeheer als afvalinzameling in hetzelfde programma bevatten. Afhankelijk van de behoefte kan de normale wijzer of de specifieke vuilnisman worden gebruikt.

Kortom, het verzamelen van afval is een methode die tegengesteld is aan handmatig geheugenbeheer. In een vuilnisman wordt het geheugen automatisch vrijgegeven op basis van een periodieke tijdsbasis of op basis van specifieke criteria die aangeven of het niet meer in gebruik is. Beide methoden hebben hun eigen voor- en nadelen. Dit kan worden geïmplementeerd en gebruikt volgens de complexiteit van de functie, afhankelijk van de gebruikte taal en de reikwijdte.

Aanbevolen artikelen

Dit is een gids voor C ++ Garbage Collection. Hier bespreken we handmatig geheugenbeheer en het algoritme voor het verzamelen van afval, samen met de voor- en nadelen. U kunt ook onze andere voorgestelde artikelen doornemen voor meer informatie -

  1. Constructor en Destructor in Java
  2. C ++ String Functies
  3. Destructor in Java
  4. Toepassingen van C ++ in Real World
  5. Top 11 kenmerken en voordelen van C ++