Ich habe mich gefragt, welcher Teil meines Codes ein dynamisch zugewiesenes, aber statisches Klassenmitglied freigibt, wenn dies nicht mehr benötigt wird. Siehe den folgenden Code: classPrinter
wird unter allen A
-Objekten geteilt und erstellt, wenn die erste Instanz der Klasse A
erstellt wird. Nur um sicher zu sein: Das classPrinter
-Objekt wird automatisch beim Beenden meines Programms zerstört, oder?
a.h
%Vor%a.cpp
%Vor%Nur um sicher zu gehen: Das
somePrinter
-Objekt wird automatisch beim Beenden meines Programms zerstört, oder?
Da dies C ++ ist, lautet die Antwort "Nein". Für alles, was mit new
zugewiesen wurde, muss das entsprechende delete
aufgerufen werden. Wenn das nicht passiert, leckt das Objekt. Aber warum all dies dynamisch zuweisen? Das
verhält sich wie Ihr Code, außer dass classPrinter
am Ende des Programms zerstört wird.
Allerdings schreibst du das
classPrinter
wird unter allen A-Objekten geteilt und erstellt, wenn die erste Instanz der KlasseA
erstellt wird.
Der Code in Ihrer Frage tut das nicht. Wenn Sie dies tun möchten, tun Sie Folgendes:
%Vor%Der intelligente Zeiger wird sicherstellen, dass das Objekt gelöscht wird.
Nein, Objekte, die mit new
erstellt wurden, werden niemals automatisch gelöscht. Sie sollten immer eine passende delete
angeben, um Speicherlecks zu vermeiden.
In diesem Fall wäre die einfachste Lösung, ein statisches Objekt anstelle eines statischen Zeigers für ein dynamisches Objekt zu haben - es gibt keinen Grund für die zusätzliche Ebene der Indirektion.
%Vor%oder wenn Sie die Konstruktion verzögern möchten, bis das Objekt benötigt wird (und mögliche Probleme vermeiden, wenn statische Objekte in anderen Übersetzungseinheiten von ihren Konstruktoren aus darauf zugreifen müssen):
%Vor%Wenn Sie in anderen Situationen dynamische Zuordnungen benötigen, sollten Sie das dynamische Objekt immer mit intelligenten Zeigern oder anderen RAII Objekte.
Der Destruktor des Objekts, auf das A::classPrinter
zeigt, wird nicht aufgerufen.
Wenn Sie darüber nachdenken, ist es nichts anderes als Logik; Wo ist die übereinstimmende delete
-Anweisung, die in normalen Fällen den dtor des Objekts aufrufen würde?
Der belegte Speicher wird wieder als frei markiert und an das System zurückgegeben, zumindest in allen modernen solchen.
Wenn A::classPrinter
unter mehreren Mitgliedern geteilt wird, kann man statt eines rohen Zeigers vielleicht std :: shared_ptr verwenden? Es wird automatisch gelöscht, sobald alle Referenzen darauf verschwunden sind.
Aber ja, der Speicher wird zurückgewonnen, nachdem das Programm beendet wurde, zumindest bei allen Betriebssystemen, die ich mir vorstellen kann ...
Statisch (so weit wie die statische Elementvariable) bedeutet immer, existiert immer.
Wenn Sie einen statischen Zeiger erstellen, können Sie die Zuordnung zu einem sinnvollen Zeitpunkt nicht aufheben. Sie brauchen mehr Kontext.
Wenn Sie freigegebene Daten haben möchten, die nur vorhanden sind, während Sie Instanzen der Eigentümerklasse für statische Mitglieder haben, benötigen Sie einen statischen Zähler. Weisen Sie immer einen neuen statischen Wert zu, wenn Sie eine Instanz und einen Zähler erstellen == 0. Weisen Sie den aktuellen statischen Wert immer dann zu, wenn Sie die letzte Instanz der Besitzerklasse löschen.
Andernfalls müssen Sie in Dinge wie freigegebene oder intelligente Zeiger eintauchen, um die Zuordnung aufzuheben, aber selbst dann treten Probleme auf. Wenn der intelligente Zeiger keine Referenzen mehr erkennt und die Zuordnung aufhebt, kann dies zu früh geschehen. Wenn es sich im freigegebenen Status befindet, was bedeutet das, wenn Sie die Informationen erneut benötigen? Ordnen Sie einen neuen statischen Wert zu?
Wenn das statische Element immer vorhanden sein muss, unabhängig davon, ob Sie eine Instanz der Besitzerklasse haben oder nicht, sollten Sie stattdessen den Zeiger in eine Referenz oder Instanz ändern.