Garbage Collector
-
Hallo zusammen,
wenn ich in einer Methode bestimmten Variablen zunächst Werte zugewiesen habe, und ich in einer Stelle danach eine Ausnahmeausgabe habe, die die weitere Bearbeitung sinnlos macht: da C++ keinen Garbage Collector besitzt, wie verfahre ich mit den gesetzten Variablen?
Danke,
Tanja
-
tanja.hopfer schrieb:
Hallo zusammen,
wenn ich in einer Methode bestimmten Variablen zunächst Werte zugewiesen habe, und ich in einer Stelle danach eine Ausnahmeausgabe habe, die die weitere Bearbeitung sinnlos macht: da C++ keinen Garbage Collector besitzt, wie verfahre ich mit den gesetzten Variablen?
Danke,
Tanja
Ach nöö.
Wenn Du eine Zeitung gelesen hast, musst Du auch nicht danach alle Buchstaben durchstreichen, weil Du sie nicht mehr brauchst.
Aber sorge dafür, daß Du die Zeitung frühzeitig aus der Wohnung entfernst, um sie nicht zuzumüllen. Das reicht schon.
In C++: Benutze new selten. Und überhaupt nur, wenn Du ein delete dafür hast. Das war schon alles. Normale Variablen verschwinden bei Ende des Blocks in dem sie definiert wurden. Ganz von automatisch. Und das ist auch gut so, schnell so, orgendlich so und überhaupt.
Der garbage collector ist nur die Putzfrau für Daten-Messies, braucht keiner. Ist eher hinderlich.
-
Hinzugefügt: Alles passiert in derselben Methode.
-
das ist aber immer noch nicht sehr aussagekräftig. Ein kurzes Coding-Beispiel, was dein Problem illustriert, wäre ganz nett.
Was bedeutet "alles in der selben Methode". Sind auch die angesprochenen Variablen nur lokal im Scope der Methode gültig? Oder wird Heap-Speicher allokiert? Oder Schlimmeres?
-
@Quisslich: es handelt sich ebenfalls um membervariablen, sowie Variablen die nur in der Methode sichtbar sind. Vor der Ausnahmeausgabe (MessageBox) werden diesen Variablen halt werte zugewiesen.
-
Ein kurzes Coding-Beispiel, was dein Problem illustriert, wäre ganz nett.
.
-
...
-
tanja im ernst. Hast du so wichtigen Code das du ihn nicht in Teilstücken zeigen kannst? In jedem Thread von dir liest man das du doch bitte mal Code zeigen sollst, doch du ignorierst das komplett.
-
Ich hab jetzt auch keine Lust, mir selbst zusammen zu reimen, was sie da vor Augen hat und welches Problem sie zu lösen versucht. Ohne Code nix los.
-
Nach folgendem Schema :):
void Methode (){ int var1 = 10; string var2 = "Text"; Dichte = 2.3; (Membervariable) if(...) { cerr << .... }
-
um welche Variablen geht es dir und welches Verhalten hättest du gerne? Die lokalen Variablen var1 und var2 werden beim Beenden des Scopes automatisch zerstört. Die Membervariable natürlich nicht. Oder möchtest du, dass die Membervariable auf den vorherigen Wert zurückgesetzt wird?
btw. Ausnahmebehandlung macht man mit Exceptions.
-
@daddy_felix: Gibt es einen Ausnahmefall den man auch ausgeben kann auf dem Bildschirm? Und es geht um die membervariable, genau wie kann man sie wieder auf den wert zurücksetzen? danke

-
tanja.hopfer schrieb:
Gibt es einen Ausnahmefall den man auch ausgeben kann auf dem Bildschirm?
Mir geht es nicht um die Ausgabe, das kannst du gerne mit cerr machen.
tanja.hopfer schrieb:
Und es geht um die membervariable, genau wie kann man sie wieder auf den wert zurücksetzen? danke

void doSomething() { double old_value = member_value; member_value = 55; if (...) { cerr << ... member_value = old_value; } }
-
Danke daddy_felix. Und ansonsten wie volkard sagte ist der Garbage Collector nicht sehr sinnvoll?
-
es gibt in C++ keinen Garbage Collector.
-
Nee ich meinte eigentlich, wie behandelt man solche Sachen in C++ ohne Garbage Collector, gerade weil man ihn nicht zur Verfügung hat?
-
Das Beispiel lässt sich auch elegant mit ScopeGuard lösen. Trotzdem zweifle ich immer noch am Sinn. Wieso willst du die Membervariable wieder zurücksetzen Tanja? Du könntest in der Memberfunktion beispielsweise eine Kopie davon verwenden.
-
tanja.hopfer schrieb:
wie behandelt man solche Sachen
was meinst du mit "solche Sachen"? Mit "new" angelegte Objekte?
Da wurde schon "RAII" und "scoped guards" genannt. Die für den Nutzer einfachste Variante sind "smart pointer".
void doSomething() { bla(); { std::unique_ptr myPtr(new MyClass(1, "hallo")); myPtr->MethodOfMyClass(); } // mit Beenden des Scopes wird die erzeugte Instanz automatisch zerstört blub(); }Generell braucht man "new" aber wesentlich weniger, als man es als JAVA-Umsteiger vermuten könnte

-
Das meinte ich daddy_felix.
Danke.