c# und delete?



  • huhu,
    von c++ kenne ich, dass mit new angeforderter speicher mit delete wieder frei wird.

    byte[] array = new byte[200];
    

    muss ich das nach benutzugn deleten?





  • Nö.
    Normalerwqeise machst Du gar nichts. Wenn der "Zeiger" namens Array zerstört wird wegen Funktionsende, dann ist der allokierte Speicher nicht mehr von einer Variablen referenziert und fliegt beim nächsten Durchlauf des Garbage Collectors raus.
    Wenn das Funktionsende gar zu weit entfernt ist, kannst Du der Variablen null zuweisen, das geht auch.



  • aaaaahh! muss ich mich nicht um delete kümmern!
    danke für deine antwort!!!



  • Es gib t bestimmte Objekte wo Du Dispose aufrufen muss.

    z.B. bei einem PEN.



  • Bedenke das der GC erst Collecten (kann) wenn keine Referenz mehr auf dem Objekt verweist. Es sei denn du verwendest eine WeakReference, da musst du aber beim benutzen immer brav überprüfen.



  • Unix-Tom schrieb:

    Es gib t bestimmte Objekte wo Du Dispose aufrufen muss.

    z.B. bei einem PEN.

    Im Ernst?
    Wird das nicht am Ende des Blockes implizit aufgerufen?



  • luker schrieb:

    Wird das nicht am Ende des Blockes implizit aufgerufen?

    leider nein...



  • luker schrieb:

    Wird das nicht am Ende des Blockes implizit aufgerufen?

    Nur wenn der Block ein using -Block ist.



  • userdisposer schrieb:

    luker schrieb:

    Wird das nicht am Ende des Blockes implizit aufgerufen?

    Nur wenn der Block ein using -Block ist.

    Und dann auch nur das Objekt das im header des using steht. Auf Objekte die innerhalb des Blockes angelegt werden wird kein dispose aufgerufen.

    Unix-Tom schrieb:

    Es gib t bestimmte Objekte wo Du Dispose aufrufen muss.

    z.B. bei einem PEN.

    Es ist weniger ein muss als ein sollte. Dispose wird spätestens von der GC automatisch aufgerufen, man kann es sich also (theoretisch) auch sparen.

    Aber...

    Da man nicht weis wann (und ob überhaupt) die GC ein Objekt abräumt bleiben alle Resourcen an dieses Objekt gebunden solange es noch nicht abgeräumt wurde, auch wenn keine Referenzen mehr darauf existieren. Dies kann gerade bei begrenzten Resourcen wie PEN, Filehandles, Db-Cursor etc schnell zu einem Problem ausarten.

    Daher wird empfohlen (irgendwo in den MSDN richtlinien) immer dann, wenn eine Klasse Dispose implementiert hat dieses auch aufzurufen wenn man das Objekt nicht mehr braucht. Gedanke: Wenn Dispose existiert, dann hat das auch seinen Grund.



  • Betrachte es als "sollte" und es gibt Probleme...


Log in to reply