neues Objekt erstellen vs objekt erstellen in C++



  • Jud4s schrieb:

    Gilt diese indirekt gesteuerte lebendsdauer für alle Variablen die man mit "new" erstellt, oder geht das nur mit Objekten?

    Garbage Collection betrifft in Java afaik alle mit new erzeugten Objekte.

    MfG SideWinder



  • Kapier ich nicht, du hast doch schon selbst festgestellt, dass es in Java analog wie in C++ funktioniert?

    Weil das meiner meinung nach umständlich ist, ich will vll garkein Objekt haben das länger als die 5 Programmzeilen "lebt".



  • Garbage Collection betrifft in Java afaik alle mit new erzeugten Objekte.

    Ich habe absichtlich den Begriff Variablen benutz. Wollte also wissen ob es auch "new strings" oder "new int" gibt.



  • Jud4s schrieb:

    Kapier ich nicht, du hast doch schon selbst festgestellt, dass es in Java analog wie in C++ funktioniert?

    Weil das meiner meinung nach dämlich ist, ich will vll garkein Objekt haben das länger als die 5 Programmzeilen "lebt".

    Wenn du soviel Kontrolle über dein Programm wirklich benötigst (Performance-Gründe, Resourcen-Knappheit, etc.) und du davon ausgehst so gut programmieren zu können, dass du den performantesten Zeitpunkt zum Löschen des Objektes besser erahnen kannst (und zwar zur Compile-Zeit) als das die JavaVM zur Runtime (also während der Ausführung) tun kann dann wäre für dich wohl C++ angebrachter. Ansonsten => Ist doch vollkommen egal, wann der Speicher dahinter wieder tatsächlich freigegeben wird. Ist ja genügend davon da.

    MfG SideWinder



  • nja. Wenn ich das Objekt später wieder benutzen will ist es doch hopps, oder wie genau soll ich das mit "referenzen" verstehen?

    {
     {
      {
        objekt erstellen
      }
      objekt benutzen //aber hier ist es doch weg weil es keine Referenz gibt oder?
     }
    }
    


  • MyClass myObj3; // nur eine referenz, zeigt auf null
    
    {
    MyClass myObj; // myObj ist eine Referenz die derzeit auf null zeigt
    myObj = new MyClass(); // hier wird mit new ein neues MyClass-Objekt angelegt, myObj ist eine Referenz darauf
    
    MyClass myObj2 = new MyClass(); // Direkt, myObj2 ist eine Referenz auf ein eues MyClass-Objekt, nun gibt es zwei Objekte und zwei Referenzen
    
    myObj3 = myObj; // myObj3 zeigt nun auch auf das erste MyClass-Objekt
    } // *
    

    Bei * werden nun die Referenzen myObj und myObj2, weil der Sichtbarkeitsbereich aus ist, gelöscht. Auf das erste mit new erzeugte Objekt zeigt immer noch myObj3 -> wird nicht vom Garbage Collector (GC) geölscht.

    Auf das Objekt, auf welches vorher myObj2 gezeigt hat, zeigt aber nun keine Referenz mehr, nie wieder wirst du es benutzen können, definitiv nicht. Der GC erkennt das und löscht es bei Gelegenheit (z.B. wenn du gerade auf eine Eingabe wartest), aber nicht unbedingt sofort.

    MfG SideWinder



  • ok, danke... jetzt versteh ich

    nun nurnoch die Frage, wie sieht das mit normalen Variablen aus?



  • Jud4s schrieb:

    nun nurnoch die Frage, wie sieht das mit normalen Variablen aus?

    Was meinst du mit "normalen" Variablen? In Java werden alle Klasseninstanzen über Referenzen angesprochen, direkt auf den Stack kommen nur wenige eingebaute Typen wie int , boolean etc. Diese wiederum kannst du ähnlich wie in C++ verwenden.

    int i = 3; // kein new bei int
    i = 5;
    

    Es gibt auch spezielle Literale für Referenztypen, wie für die Klasse String oder Arrays. Diese sollen aber nicht darüber hinwegtäuschen, dass das Objekt dynamisch auf dem Heap angelegt wird.

    String s = "hallo";
    int[] a = {1,2,3};
    

    Ansonsten: Drück dich genauer aus.



  • Er fragt sich ob auch int, double, etc. bzw. nahezu-Standard-Typen wie String via Garbage Collector gelöscht werden oder auf den Stack kommen. Bzw. wie es bei int i = new int; aussieht (gibt es soetwas in Java überhaupt?)

    MfG SideWinder



  • Nein, primitive Typen können nicht mit new angelegt werden und kommen auf den Stack. Anders sieht es bei String oder den Wrapperklassen Integer & Co. aus.


Anmelden zum Antworten