Was ist C ++ Garbage Collection?

Die Speicherbereinigung ist eine Speicherverwaltungstechnik. Es handelt sich um eine separate automatische Speicherverwaltungsmethode, die in Programmiersprachen verwendet wird, in denen die manuelle Speicherverwaltung nicht bevorzugt oder nicht durchgeführt wird. Bei der manuellen Speicherverwaltungsmethode muss der Benutzer den verwendeten Speicher angeben, der freigegeben werden kann, während der Garbage Collector den Speicher sammelt, der von Variablen oder Objekten belegt ist, die im Programm nicht mehr verwendet werden. Nur der Speicher wird von Garbage Collectors verwaltet, andere Ressourcen wie Destruktoren, Benutzerinteraktionsfenster oder Dateien werden vom Garbage Collector nicht verarbeitet.

Nur wenige Sprachen benötigen Müllsammler als Teil der Sprache für eine gute Effizienz. Diese Sprachen werden als müllsammelnde Sprachen bezeichnet. Beispielsweise benötigen Java, C # und die meisten Skriptsprachen eine Speicherbereinigung als Teil ihrer Funktionsweise. Während Sprachen wie C und C ++ die manuelle Speicherverwaltung unterstützen, die dem Garbage Collector ähnelt. Es gibt nur wenige Sprachen, die sowohl die Garbage Collection als auch die manuell verwaltete Speicherzuweisung / Freigabe unterstützen. In solchen Fällen wird dem Garbage Collector und dem manuellen Speicher ein separater Speicherhaufen zugewiesen.

Einige der Fehler können verhindert werden, wenn die Garbage Collection-Methode verwendet wird. Sowie:

  • baumelndes Zeigerproblem, bei dem der Speicher, auf den verwiesen wird, bereits freigegeben ist, während der Zeiger noch verbleibt und auf andere neu zugewiesene Daten oder bereits gelöschten Speicher verweist
  • Das Problem, das auftritt, wenn versucht wird, einen bereits gelöschten oder einem anderen Objekt zugewiesenen zweiten Speicher zu löschen oder die Zuordnung aufzuheben
  • beseitigt Probleme oder Fehler, die mit Datenstrukturen verbunden sind, und erledigt den Speicher und die Datenverarbeitung effizient
  • Speicherlecks oder Probleme mit der Speicherentleerung können vermieden werden

Sehen wir uns ein detailliertes Verständnis der manuellen Speicherverwaltung im Vergleich zur Garbage Collection an, sowie der Vor- und Nachteile und der Implementierung in C ++.

Manuelle Speicherverwaltung

Der dynamisch zugewiesene Speicher während der Laufzeit vom Heap muss freigegeben werden, wenn wir diesen Speicher nicht mehr verwenden. Dynamisch zugewiesener Speicher bezieht Speicher aus dem Heap, bei dem es sich um einen freien Speicher handelt.

In C ++ erfolgt diese Speicherzuweisung und Freigabe manuell mit Befehlen wie new, delete. Die Verwendung von "neuem" Speicher wird aus dem Heap zugewiesen. Nach seiner Verwendung muss dieser Speicher mit dem Befehl 'delete' gelöscht werden.

Jede Speicherzuweisung mit 'Neu' muss mit einem 'Löschen'-Befehl abgeschlossen werden. Wenn nicht, gehen wir aus dem Gedächtnis.

Um es mit einem Beispiel deutlich zu machen:

n = neues sample_object;
**********************************************
lösche n;

Wie gezeigt, sollte jeder neue Befehl mit einem Löschbefehl enden oder sich neigen. Hier wird n Zeiger mit dem Befehl 'new' Speicher zugewiesen und auf ein Objekt namens 'sample_object' verwiesen oder darauf hingewiesen. Sobald die Verwendung und Funktion des Zeigers abgeschlossen ist, sollten wir den Speicher wie oben beschrieben mit dem Befehl 'delete' freigeben oder freigeben.

Bei der Garbage Collection wird der Speicher jedoch mit dem Befehl 'new' zugewiesen, muss jedoch nicht mit 'delete' manuell freigegeben werden. In solchen Fällen wird der Garbage Collector regelmäßig ausgeführt und auf freien Speicher überprüft. Wenn ein Teil des Speichers nicht auf ein Objekt zeigt, wird der Speicher gelöscht oder freigegeben, wodurch mehr freier Speicherplatz entsteht.

Vor- und Nachteile der manuellen Speicherverwaltung

Die manuelle Speicherverwaltung bietet den Vorteil, dass der Benutzer die vollständige Kontrolle über die Zuweisung und Freigabe von Vorgängen hat und auch weiß, wann ein neuer Speicher zugewiesen wird und wann die Zuweisung oder Freigabe aufgehoben wird. Im Fall der Garbage Collection wird der Speicher jedoch genau in der gleichen Instanz, in der er nach der Verwendung nicht freigegeben wird, freigegeben, wenn er während des periodischen Vorgangs auf ihn stößt.

Auch im Fall der manuellen Speicherverwaltung wird der Destruktor im selben Moment aufgerufen, in dem wir den Befehl 'delete' aufrufen. Aber im Fall von Garbage Collector ist das nicht implementiert.

Mit der manuellen Speicherverwaltung sind einige Probleme verbunden. Manchmal kann es vorkommen, dass der belegte Speicher doppelt gelöscht wird. Wenn wir den bereits gelöschten Zeiger oder Speicher löschen, besteht die Möglichkeit, dass der Zeiger auf andere Daten verweist und verwendet werden kann.

Ein weiteres Problem bei der manuellen Speicherverwaltung ist, dass, wenn während der Ausführung oder Verwendung des neuen zugewiesenen Zeigers eine Ausnahme auftritt, die Sequenz von "new" und "delete" verlassen wird und der Freigabevorgang nicht ausgeführt wird durchgeführt. Außerdem kann es zu Speicherverlusten kommen.

Vor- und Nachteile des Garbage Collector

Ein Hauptnachteil der Speicherbereinigung ist die Zeit oder die CPU-Zyklen, die erforderlich sind, um den nicht verwendeten Speicher zu finden und zu löschen, selbst wenn der Benutzer weiß, welcher Zeigerspeicher freigegeben und nicht verwendet werden kann. Ein weiterer Nachteil ist, dass weder der Zeitpunkt des Löschens noch der Aufruf des Destruktors bekannt sind.

Speicherbereinigungsalgorithmus

Es gibt viele Algorithmen für die Speicherbereinigung, z. B. Referenzzählung, Markieren und Wischen, Kopieren usw. Zum besseren Verständnis wird ein Algorithmus im Detail beschrieben. Wenn wir zum Beispiel den Referenzzählungsalgorithmus sehen, hat jeder dynamische Speicher eine Referenzzählung. Wenn eine Referenz erstellt wird, erhöht sich der Referenzzähler, und wenn eine Referenz gelöscht wird, wird der Referenzzähler verringert. Sobald der Referenzzähler Null wird, wird angezeigt, dass der Speicher nicht verwendet wird und freigegeben werden kann.

Dieser Algorithmus kann unter Verwendung eines bestimmten Zeigertyps in C ++ implementiert werden. Es sollte ein bestimmter Zeigertyp deklariert werden, der beispielsweise zum Verfolgen aller erstellten Verweise und zum Verfolgen des Verweiszählers beim Erstellen und Löschen von Verweisen verwendet werden kann. Ein C ++ - Programm kann sowohl manuelle Speicherverwaltung als auch Garbage Collection enthalten, die im selben Programm stattfinden. Je nach Bedarf kann entweder der normale Zeiger oder der spezifische Speicherbereinigungszeiger verwendet werden.

Zusammenfassend ist die Speicherbereinigung eine Methode, die der manuellen Speicherverwaltung entgegengesetzt ist. In einem Garbage Collector wird der Speicher basierend auf einer periodischen Zeitbasis oder basierend auf bestimmten Kriterien, die angeben, ob er nicht mehr verwendet wird, automatisch freigegeben. Beide Methoden haben ihre Vor- und Nachteile. Dies kann entsprechend der Komplexität der Funktion implementiert und verwendet werden, abhängig von der verwendeten Sprache und ihrem Umfang.

Empfohlene Artikel

Dies ist eine Anleitung zur C ++ Garbage Collection. Hier diskutieren wir die manuelle Speicherverwaltung und den Garbage Collection-Algorithmus mit den Vor- und Nachteilen. Sie können auch unsere anderen Artikelvorschläge durchgehen, um mehr zu erfahren -

  1. Konstruktor und Destruktor in Java
  2. C ++ - String-Funktionen
  3. Destruktor in Java
  4. Anwendungen von C ++ in der realen Welt
  5. Top 11 Features und Vorteile von C ++