Referenzen und Daten GC Frage?



  • Was passiert hier? Es wird ein foo object aufm heap gehaun, und die "referenz" auf diese instanz in Data Object abgelegt und diese zurückgegben.
    Sorgt der GC bzw. das memorymanagemnt dafür das foo erst wieder gelöscht wird, wenn Data auch nicht mehr verwendet wird? oder muss ich im Konstruktor von Data das obejekt kopieren bzw. clonen?

    class Data{
    
     public Data(object d){
       dat= d;
     }
     object dat;
    }
    
    Data test(){
      object x= new Foo();
      return new Data(x);
    }
    


  • Einfach betrachtet ist es ganz einfach: Solange eine Referenz auf das Okjekt existiert wird dieses nicht gelöscht.

    In Deinem Beispiel existieren 3 Referenzen auf Foo:

    object x <- erste referenz
    object d <- temporäre Referenz
    object dat <- dritte referenz

    solange eine der Referenzen existiert wird auch das referenzierte Objekt existieren.

    Aber...

    Das bedeutet nicht das das Objekt freigegeben wird sobald keine Referenz mehr existiert, es beudetet nur das es mindestens solange nicht freigegeben wird wie eine Referenz existiert. Das ist (in der Framework GC) tatsächlich ein UNterschied den man beachten muß.

    Aus Performancegründen sortiert die GC Objekte in sogenannten Generationen. Generation 0 sind kurzlebige Objekte die relativ häufig geprüft werden (ob sie freigegeben werden können). Sollten Objekte ein gewisses "Alter" erreichen, landen sie in Generation 1. Objekte dieser Generation werden seltener wegen möglicher Freigabe geprüft. Das ganze geht hin bis zur Generation 3. Objekte die es bis in diese Generation schaffen werden erst am Ende der Applikation aufgeräumt, egal ob sie vorher freigegeben werden oder nicht.

    Es kann also passieren das zwar alle Referenzen auf ein Objekt gelöscht wurden, das Objekt aber trotzdem noch beliebig lange weiterlebt bevor es aufgeräumt wird.



  • ok danke schon mal.. in diesem beispiel...

    class Data{
    
     public Data(ref object d){
       dat= d;
     }
     object dat;
    }
    
    Data test(){
      object x= new Foo();
      return new Data(ref x);
    }
    

    ...wäre d eine referenz auf eine referenz? seh ich das richtig...?

    Wenn ich Objecte kopieren möchste , wie stell ich das an? Muss ich ein copyconstructor implementieren oder macht das C# autoamtische?



  • BorisDieKlinge schrieb:

    ok danke schon mal.. in diesem beispiel...

    class Data{
    
     public Data(ref object d){
       dat= d;
     }
     object dat;
    }
    
    Data test(){
      object x= new Foo();
      return new Data(ref x);
    }
    

    ...wäre d eine referenz auf eine referenz? seh ich das richtig...?

    Nein. ALLES sind Referenzen auf das referenzierte Objekt. Es geht ja darum zu wissen von wievielen Stellen aus ein Abjekt referenziert wird.

    also object x = new String();
    object y = x;

    erzeugt zwei Referenzen auf ein String-Objekt.



  • loks schrieb:

    BorisDieKlinge schrieb:

    ...wäre d eine referenz auf eine referenz? seh ich das richtig...?

    Nein...

    Doch doch, das stimmt schon, d ist eine Referenz auf (in dem Fall) x und x wiederum ne Referenz auf das Object das mit new Foo() erzeugt wurde. Aber da du d nicht änderst ist das ref hier völlig unnötig, denn anders als z.B. in C++ kannst du Referenzen auf Referenzen nicht als Vaiablen benutzen, sondern sie werden wieder automatisch dereferenziert.

    dat= d;
    

    Hier wird der Referenz dat wieder das eigentliche Objekt zugewiesen und nicht die Referenz auf das Objekt wie man es hätte erwarten können.

    Wenn ich Objecte kopieren möchste , wie stell ich das an? Muss ich ein copyconstructor implementieren oder macht das C# autoamtische?

    Es gibt in .Net keinen allgemeingültigen Weg automatisch Objekte zu kopieren, jedenfalls net mit ner Deep Copy, Shallow Copy dagegen ist kein Problem (ist aber auch meist net gewünscht). Statt nen Copy Konstruktor solltest du IClonable implementieren.



  • danke ihr beiden;)

    ich seh schon, C# und C++ sind zwei welten^^


Log in to reply