Beginnen wir mit der Annahme, dass Speicher weitaus häufiger (Dutzende, Hunderte oder sogar Tausende) ist als alle anderen Ressourcen zusammen. Jede einzelne Variable, jedes Objekt und jedes Objektmitglied benötigt Speicher, der ihr zugewiesen und später freigegeben wird. Für jede Datei, die Sie öffnen, erstellen Sie Dutzende bis Millionen von Objekten, um die aus der Datei abgerufenen Daten zu speichern. Jeder TCP-Stream enthält eine unbegrenzte Anzahl temporärer Bytefolgen, die zum Schreiben in den Stream erstellt wurden. Sind wir hier auf der gleichen Seite? Groß.
Damit RAII funktioniert (auch wenn Sie vorgefertigte intelligente Zeiger für jeden Anwendungsfall unter der Sonne haben), müssen Sie das Eigentumsrecht erwerben. Sie müssen analysieren, wem dieses oder jenes Objekt gehören soll, wem nicht und wann das Eigentum von A auf B übertragen werden soll. Sicher, Sie könnten das gemeinsame Eigentum für alles verwenden , aber dann würden Sie einen GC über intelligente Zeiger emulieren. An diesem Punkt wird es viel einfacher und schneller, den GC in die Sprache zu integrieren.
Die Garbage Collection befreit Sie von dieser Sorge um die bei weitem am häufigsten verwendete Ressource Speicher. Sicher, Sie müssen immer noch die gleiche Entscheidung für andere Ressourcen treffen, aber diese sind weitaus seltener (siehe oben) und komplizierte (z. B. gemeinsame) Eigentumsverhältnisse sind ebenfalls seltener. Die mentale Belastung wird deutlich reduziert.
Nun nennen Sie einige Nachteile, um alle Werte müllsammeln zu lassen. Doch beiden Speichersichere GC zu integrieren und mit RAII in eine Sprache Werttypen ist extrem hart, so ist es vielleicht besser , diese Abwägungen über andere Mittel , um zu migitate?
Der Verlust des Determinismus erweist sich in der Praxis als nicht so schlimm, da er sich nur auf die Lebensdauer des deterministischen Objekts auswirkt . Wie im nächsten Abschnitt beschrieben, sind die meisten Ressourcen (abgesehen vom Arbeitsspeicher, der reichlich vorhanden ist und ziemlich träge recycelt werden kann) in diesen Sprachen nicht an die Lebensdauer von Objekten gebunden. Es gibt einige andere Anwendungsfälle, die meiner Erfahrung nach jedoch selten sind.
Ihr zweiter Punkt, die manuelle Ressourcenverwaltung, wird heutzutage über eine Anweisung angesprochen, die eine bereichsbezogene Bereinigung durchführt, diese Bereinigung jedoch nicht an die Objektlebensdauer koppelt (also nicht mit dem GC und der Speichersicherheit interagiert). Dies ist using
in C #, with
in Python, try
-mit-Ressourcen in neueren Java-Versionen.