Integer to String ???
-
Wenn ich meinem Lehrstoff so Glauben schenken sollte, steht das "gc" in "gcnew" für Garbage Collection.
Ein Handle das mit "new" erzeugt wurde, wird zwar auf dem Heap abgelegt, aber nicht vom Garbage Collector verwaltet.
Ein Handle das mit "new" erzeugt wurde, muss auch wieder über "delete" gelöscht werden, um den belegten Speicher freizugeben.
Ferner werden auch Variablen mit dem Dach ^ auf dem Heap abgelegt, aber nicht vom Garbage Collector verwaltet.
Irres Thema.
Möchte jetzt hier auch nicht das ganze Forum mit dem Quatsch zunageln.
Ich werde dieses Thema jetzt auch an die Wand hängen und warten bis mein nächster Dozent wieder da ist.
Aber Danke nochmal für die Hilfe und die Geduld.
Ich denke mal diese C++/CLI Gesichte ist für manche Dozenten auch noch ein Buch mit 7 Siegeln.
-
Melle schrieb:
Nur Objekte, die Sie mit "new" erzeugen, werden auf dem Heap abgelegt.
So und nun
Ich denke doch mal ihr habt auch sicher dafür eine ErklärungJetzt kann ich ja sowas machen:
Int32^ sinnlos() { return gcnew Int32(17); }
Diese Funktion legt ein Objekt mit Hilfe von gcnew auf dem (verwalteten) Heap an und gibt den Handle darauf zurück. Wenn ich sie aufrufe sehe ich ja nicht, was intern passiert.
Ähnlich, wie diese (sinnlose) Funktion das Erstellen eines Objekts auf dem Heap versteckt tut das auch das Schachteln. Auch hier wird intern ein Objekt auf dem Heap angelegt und ich bekomme einen Handle darauf.
Aus
object ^ foo = 42;
macht der Compiler sowas, wie:
object ^ foo = __box(42);
, wobei __box eben die Funktion ist, die intern ein Objekt auf dem Heap anlegt.
-
Melle schrieb:
Ferner werden auch Variablen mit dem Dach ^ auf dem Heap abgelegt, aber nicht vom Garbage Collector verwaltet.
Ich galube, da hab ich was falsches gesagt...
Irgendwas mit "gcnew" und ^liegt *immer* auf dem verwalteten Heap.
Das andere was nur, wie der GC noch aktivie Referenzen findet... sorry...
-
pharmacy;
-
pharmacy;
-
Hallo!
Jochen Kalmbach schrieb:
Das *einzige* was zählt ist: Wie wurde die Variable deklariert:
Stack:
... StreamWriter sw;
Das stimmt so nicht. Ein Objekt einer ref-Klasse liegt immer auf dem
verwalteten Heap (egal ob mit gcnew und ^ oder ohne). Auf dem Stack liegt nur
die Referenz. Wenn sw den Gültigkeitsbereich verlässt, wird der Destruktor
aufgerufen (falls es diesen gibt). Das Objekt bleibt aber bestehen, bis keine
Referenz mehr darauf existiert.z.B.:
StreamWriter^ psw; { StreamWriter sw(...); psw = %sw; }
psw zeigt danach nicht etwa auf freigegebenen Speicher - nur auf ein ungültiges
Objekt.Übrigens kann man den Destruktor auch manuell mit delete aufrufen (damit
wird jedoch nicht der Speicher freigegeben).Alex
-
Lion,
abgesehen davon, das der Beitrag über 1 Jahr alt ist, hat Jochen direkt über Deinem Post geschrieben:
Ich galube, da hab ich was falsches gesagt...
Irgendwas mit "gcnew" und ^liegt *immer* auf dem verwalteten Heap.
Das andere was nur, wie der GC noch aktivie Referenzen findet... sorry...