C ++ statisches Klassenmitglied, wer räumt das Chaos auf?

8

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%     
Eric 20.12.2011, 15:56
quelle

6 Antworten

19
  

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

%Vor%

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 Klasse A 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.

    
sbi 20.12.2011, 16:00
quelle
10

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.

    
Mike Seymour 20.12.2011 16:05
quelle
3

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.

    
Filip Roséen - refp 20.12.2011 15:58
quelle
0

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 ...

    
Dimitar Velitchkov 20.12.2011 16:02
quelle
0

Sie müssen einen Wrapper erstellen oder etwas wie shared_ptr verwenden, um den Aufruf von dtor zu garantieren.

    
Yola 20.12.2011 16:04
quelle
0

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.

    
Lee Louviere 20.12.2011 17:04
quelle

Tags und Links