Warum gibt es keine NULL-Reference



  • Warum gibt es bei Referenzen nicht einen besonderen Zustand, wie es fuer Pointer den NULL-Pointer gibt?



  • Weil Referenzen immer gültig sein sollen. Sie sind ein Alias für ein Objekt.

    In Java und C# bedeuten Referenzen aber etwas anderes und sind teilweise eher verkrüppelte Pointer. Aber das ist eben nötig, damit man Garbage Collection wohl vernünftig implementieren kann.



  • kingruedi schrieb:

    Weil Referenzen immer gültig sein sollen.

    man kann auch 'ne 0-referenz in c++ basteln

    ...
      int *a = (int*)0;
      int &b = *a;
    
      b = 100; // crash, schreibzugriff auf adresse 0
    ...
    


  • Man kann sich natürlich auch eine heiße Nadel durchs Auge stechen oder sich mit dem Hammer stundenlag auf den Kopf schlagen oder....



  • @net: Dein Code erzeugt undefiniertes Verhalten, weil du einen 0-Zeiger dereferenzierst. Du hast also keine wohldefinierte 0-Referenz.

    @kingruedi: Das "verkrüppelt" hab ich jetzt überhört. 😉
    Es sind auch keine Pointer, sondern Pointer auf Pointer, wenn ich das mal so sagen darf. Ein andere Name dafür ist also völlig gerechtfertigt.



  • Optimizer schrieb:

    @kingruedi: Das "verkrüppelt" hab ich jetzt überhört. 😉

    hrhr, ich hab nur gewartet, wie lange du brauchst 😉

    @net
    das muss man wohl nicht weiter kommentieren 🙄



  • kingruedi schrieb:

    @net
    das muss man wohl nicht weiter kommentieren 🙄

    wieso nicht? wolltest du noch was dazu sagen? schade nur, dass es undefiniertes verhalten ist, wie optimizer schreibt.



  • net schrieb:

    schade nur, dass es undefiniertes verhalten ist, wie optimizer schreibt.

    es ist absoluter bloedsinn.
    weder syntaktisch noch semantisch macht es sinn.

    was soll man also dazu sagen?



  • Shade Of Mine schrieb:

    es ist absoluter bloedsinn.
    weder syntaktisch noch semantisch macht es sinn.

    syntaktisch falsch? mein oller mingw compiled es ohne murren 😕



  • net schrieb:

    Shade Of Mine schrieb:

    es ist absoluter bloedsinn.
    weder syntaktisch noch semantisch macht es sinn.

    syntaktisch falsch? mein oller mingw compiled es ohne murren 😕

    "weder $A noch Bmachtessinn"!="B macht es sinn" != "A ist falsch"

    🙄

    Ansonsten hat CarstenJ schon alles gesagt, was ich zu dem Code sagen würde.



  • kingruedi schrieb:

    "weder $A noch Bmachtessinn"!="B macht es sinn" != "A ist falsch"
    🙄
    Ansonsten hat CarstenJ schon alles gesagt, was ich zu dem Code sagen würde.

    dass der code irgendwie nicht sehr sinnvoll ist bzw. sich undefiniert verhält ist die eine sache...gcc compiled ihn jedenfalls, syntaxfehler sind's nicht.
    irgendwie bin' ich euch auf den schlips getreten damit, was 😕 😉



  • irgendwie bin' ich euch auf den schlips getreten damit, was

    Es nervt nur, dass wenn die Frage bereits auf Seite 1 schon längst ausreichend beantwortet wurde, der Thread dennoch bis Seite 12 und noch weiter wächst.



  • CarstenJ schrieb:

    irgendwie bin' ich euch auf den schlips getreten damit, was

    Es nervt nur, dass wenn die Frage bereits auf Seite 1 schon längst ausreichend beantwortet wurde, der Thread dennoch bis Seite 12 und noch weiter wächst.

    nanana, selbst dein erster post liest sich so, als wärst du schon ziemlich genervt



  • net schrieb:

    CarstenJ schrieb:

    irgendwie bin' ich euch auf den schlips getreten damit, was

    Es nervt nur, dass wenn die Frage bereits auf Seite 1 schon längst ausreichend beantwortet wurde, der Thread dennoch bis Seite 12 und noch weiter wächst.

    nanana, selbst dein erster post liest sich so, als wärst du schon ziemlich genervt

    Naja, liegt wahrscheinlich am Wetter.... 😉



  • CarstenJ schrieb:

    Naja, liegt wahrscheinlich am Wetter.... 😉

    Stell dich nicht so an - ist endlich mal wieder schoen kuehl.



  • Optimizer: Wo kann man das denn nachlesen, dass Java-Referenzen sowas wie Pointer auf Pointer sind? Sie fühlen sich beim Programmieren jedenfalls in jeder Hinsicht wie einfache Pointer an.



  • In Java sind das eindeutig Pointer, oder warum gibts in Java "NullPointerExceptions"??? 😮

    Habe darüber auch mit meinen Java-Kollegen diskutiert, wir sind zu dem Schluss gekommen, das das Wort Referenz in Java nur Marketingstrategie ist. Die Dinger sind im Grunde genauso fehleranfällig wie Pointer in C++, mit dem einzigen Vorteil, das man sich nicht um ein Delete kümmern muß.

    Object t = null;
    t.toString();    // PENG!
    


  • Bashar schrieb:

    Optimizer: Wo kann man das denn nachlesen, dass Java-Referenzen sowas wie Pointer auf Pointer sind? Sie fühlen sich beim Programmieren jedenfalls in jeder Hinsicht wie einfache Pointer an.

    Pointer auf Pointer fühlen sich auch wie Pointer an.

    MyClass** a, b, c;
    a = b = c;
    c = new MyClass();  // Angenommen, new liefert MyClass**
    b = c;
    

    Der Unterschied ist rein technischer Natur. Als Programmierer nimmt man nur Einfluss auf das MyClass**, MyClass* kann nur vom GC geändert werden, was er dann macht, wenn er die Objekte verschiebt.
    Es wäre nämlich etwas unsinnig, beim Verschieben von ein paar hundert Objekten alle Referenzen darauf zu suchen und anzupassen. Daher die zusätzliche Indirektion, von der man in Java natürlich weder syntaktisch nocht semantisch (aus o.g. Gründen) etwas mitbekommt, so wie man auch von der ersten Indirektion zumindest syntaktisch nichts mitbekommt.

    Noch interessante Links:
    http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html
    http://msdn.microsoft.com/msdnmag/issues/1100/gci/
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndotnet/html/dotnetperftechs.asp

    In Java sind das eindeutig Pointer, oder warum gibts in Java "NullPointerExceptions"??? 😮

    Das ist mal ne richtig geile Begründung, danke, hast mich überzeugt. 😉

    Die Dinger sind im Grunde genauso fehleranfällig wie Pointer in C++, mit dem einzigen Vorteil, das man sich nicht um ein Delete kümmern muß.

    Welche Fehleranfälligkeit bleibt denn deiner Meinung nach noch? delete hast du schon genannt, Pointerarithmetik geht auch nicht ... ganz schön gefährlich, dein null. 😕



  • Artchi schrieb:

    Die Dinger sind im Grunde genauso fehleranfällig wie Pointer in C++,

    aber nur weil man 'ner java-referenz 'null' zuweisen kann. referenzen _sind_ pointer im anderen gewand. der wolf im schafspelz, hehe, nur wird das dem 08/15 c++ user nicht so bewusst



  • Optimizer schrieb:

    Der Unterschied ist rein technischer Natur. Als Programmierer nimmt man nur Einfluss auf das MyClass**, MyClass* kann nur vom GC geändert werden, was er dann macht, wenn er die Objekte verschiebt.

    Und wer verschiebt die MyClass-Pointer? Löst das überhaupt ein Problem, oder verschiebt es das nur?
    So ein Problem kann es doch nicht sein, alle Pointer zu ändern. Der GC durchläuft sie ja ohnehin während der Mark-Phase.


Anmelden zum Antworten