C# Instanzen auf dem Heap: Keine Memoryleaks?

Abcd12345

Lt. Junior Grade
Registriert
März 2006
Beiträge
483
Hi,

Ich habe mich jetzt eine längere Zeit mit C++ beschäftigt und habe schon recht Solide Fähigkeiten im Umgang mit der Sprache erlangen können. Nun bin ich grade dabei zusätzlich noch C# zu lernen, da wir dies balt in der Schule machen werden.

Ich arbeite hierzu grade ein recht Umfangreiches Galileobuch durch. Hier wird ganz am Anfang erwähnt, dass C# im Gegensatz zu C++ vor Memoryleaks geschützt ist. Auch mein ich gelesen zu haben, dass Zeiger/Pointer komplett wegfallen



Nun sehe ich so etwas aber ständig im Buch:

C# Code:
Code:
Circle kreis = new Circle;

Wird hier nicht ein räumlich und temporär unbegrenzter Speicherraum festgelegt, dessen Adresse in "kreis" gespeichert wird?

In C++ würde so etwas ja so aussehen:

C++ Code:
Code:
Circle *kreis = NULL;
Circle kreis = new Circle;

Wenn es stimt und man mit
C# Code:
Code:
Circle kreis = new Circle;

tatsächlich Speicher reserviert dann können doch auch in C# Memoryleaks auftreten. Wenn man sich sehr viele Instanzen erzeugen würde ohne den Speicher wieder freizugeben.. Es sei denn, das Programm würde Anfangen irgendwann diese Speichrbereiche wieder von alleine Freizugeben wenn die Gefahr eines Vollgeschriebenen SPeichers besteht aber dies kann ja auch nicht sein, da ja nicht bekannt sein kann ob der Speicher nun noch gebreuacht wird oder nicht..

Ich würde mich über Hilfe freuen :)
 
Zuletzt bearbeitet:
Naja wenn du in C++ ganz viele Instanzen erzeugst geht dir früher oder später auch da der Speicher aus. Das liegt nunmal in der Natur des Computers, dass die Ressourcen begrenzt sind. Das kann man nur durch Spielereien wie virtueller Speicher etc. herauszögern aber früher oder später ist immer Schluss.
Auf was du vielleicht hinaus willst ist die Tatsache, dass es unter C# genau wie in Java keine expliziten Destruktoren gibt. Das wird dort anders als in C++ von einem Garbagecollector mehr oder weniger automatisch geregelt.
 
Zuletzt bearbeitet:
Der GC regelt das alles, wenn eine Variable nicht mehr gebraucht wird, wird der Speicher freigegeben.
Übrigens gibt es auch in C# Pointer, allerdings nur in "unsafe" Code und man braucht sie eigentlich nicht.
 
Also sehe ich, dass jetzt richtig, dass mit:


C# Code:
Code:
Circle kreis = new Circle;

Speicher reserviert wird und "kreis" die Adresse zu diesem Speicherbereich speichert. Dieser Speicherbereich wird dann allerdings vom "Garbagecollector" automatisch wieder freigegeben?

Wann würde denn der Garbagecollector den Speicher freigeben und wie kann dieser Programmteil inteligent genug agieren um den Speicher nur dann freizugeben, wenn er auch wirklich nicht mehr gebraucht wird?
 
Abcd12345 schrieb:
Wann würde denn der Garbagecollector den Speicher freigeben
Only God Knows ;)

Du brauchst keine Angst haben, dass dir der GC einen Speicher freigibt, der noch verwendet wird. Allerdings weißt du auch nie, wann der GC den Speicher genau freigeben wird. Nicht umsonst haben alle Programmiersprachen mit GC einen extremen Speicherverbrauch, ganz oben in dieser Liste steht natürlich Java.

Grundsätzlich funktioniert ein GC so, dass jedes mal wenn die Adresse eines Objektes irgendwo gespeichert wird, ein interner Counter hochgezählt wird. Wird eine dieser gespeicherten Adressen wieder verworfen (z.B. per Zuweisung kreis = null), dann wird dieser Counter um eins heruntergezählt. Wenn der GC dann mal so gütig ist, und ein bisschen Müll aufsammelt, dann überprüft dieser einfach den Zählerstand des Counters. Ist dieser bei 0 angekommen, dann wird der Speicher freigegeben.
 
Kann hier nur immer wieder mal wieder die Webcasts bei Microsoft empfehlen (nach Webcast finder googlen), dort gibt's auch nen Webcast zum GC...
 
c#/.net hält symbolische infos über klassen. darüber lässt sich feststellen, ob es z.b. ein objekt gibt, das einen zeiger auf ein anderes objekt hält. alle objekte, auf die es keinen zeiger mehr gibt, werden vom garbage collector automatisch freigegeben..

haste z.b.
Circle kreis = new Circle;
kreis = null;

so kann der garbage collector das objekt freigeben (und wird es auch zu gegebener zeit auch tun).
 
Man kann das sogar ein wenig "steuern" in .net
wie gesagt, Webcast schauen ;-)
 
Zurück
Oben