Objectpointer



  • Test t1;
    Test* t2
    

    t2 ist vom Typ Pointer und ist meist 4 oder 8 Byte gross (compilerabhaengig). Zeiger zeigen fuer gewoehnlich auf etwas. Hier auf ein Objekt, das mit new erzeugt wurde. Alles was mit new erzeugt wurde, muss (sollte) mittels delete geloescht werden. Um das Objekt zu identifizieren wird der Zeiger t2 benutzt. Der Zeiger t2 ist nach dem delete noch genauso vorhanden wie vorher und zeigt immer noch auf die gleiche Stelle. Da ist aber kein Testobjekt mehr.

    Warum muss ich bei t2 manuell den Speicher freigeben wenn ich doch auf den destructor zugreifen kann

    t2 ist ein Zeiger. Der hat keinen Destruktor. Genau wie: eine Hand mag auf ein Flugzeug zeigen, ist deswegen aber noch lange kein Flugzeug.

    Btw. Der Beitrag von Sone ist jetzt nicht so daneben.



  • okay danke, ich dachte c++ würde mir hier impliziert einen pointer geben. Deswegen habe ich sizeof() benutzt. t1 und t2 waren beide 4, also einfach angenommen das beide vom typ pointer sind.



  • knivil schrieb:

    Btw. Der Beitrag von Sone ist jetzt nicht so daneben.

    Also ist t1 eine Referenz?



  • knivil schrieb:

    Btw. Der Beitrag von Sone ist jetzt nicht so daneben.

    Also können Referenzen immer nur gültige Objekte referenzieren?



  • Wie oft denn noch? schrieb:

    knivil schrieb:

    Btw. Der Beitrag von Sone ist jetzt nicht so daneben.

    Also können Referenzen immer nur gültige Objekte referenzieren?

    Du hast es kapiert. 👍

    Swordfish schrieb:

    knivil schrieb:

    Btw. Der Beitrag von Sone ist jetzt nicht so daneben.

    Also ist t1 eine Referenz?

    Für den Compiler macht das null Unterschied.
    P.S.: Ist es natürlich nicht. Aber man kann es als Referenz betrachten, weil t1 intern, genau wie eine Referenz, nur ein konstanter Zeiger mit Syntaxzucker ist, und es eben syntaktisch keinen Unterschied macht.



  • Ich verstehe nicht, wieso Referenzen nur auf gültige Objekte referenzieren können. Eigentlich sind die doch genau wie Zeiger, nur dass gilt, dass bei Definition auch Initialisierung geschehen muss (<- keine Ahnung, ob das jetzt nach Standard streng genug definiert ist).

    Folgende Referenzen auf ungültige Objekte funktionieren doch syntaktisch:

    int* ptr = new int(5);
    int& ref1 = *ptr;
    
    delete ptr; // nun zeigt refl auf kein gültiges Objekt mehr
    

    Zweitens hat t2 doch eine Indirektion, die t1 nicht hat oder nicht? Geschieht Zugriff auf den Stack nicht schneller? Oder begründet sich der schnellere Zugriff darauf, dass der aktuelle Stackbereich eben "näher" im Vergleich zum Freispeicher und garantiert cachelokal ist?



  • Sone schrieb:

    Wie oft denn noch? schrieb:

    Also können Referenzen immer nur gültige Objekte referenzieren?

    Du hast es kapiert. 👍

    Swordfish schrieb:

    Also ist t1 eine Referenz?

    Für den Compiler macht das null Unterschied.
    P.S.: Ist es natürlich nicht. Aber man kann es als Referenz betrachten, weil t1 intern, genau wie eine Referenz, nur ein konstanter Zeiger mit Syntaxzucker ist, und es eben syntaktisch keinen Unterschied macht.

    Sone, wie lernresistent kann man eigentlich sein? Deine Aussagen wurden dermassen widerlegt, dass sie nie mehr auch nur annähernd wahr werden 🙄



  • Sone schrieb:

    Wie oft denn noch? schrieb:

    knivil schrieb:

    Btw. Der Beitrag von Sone ist jetzt nicht so daneben.

    Also können Referenzen immer nur gültige Objekte referenzieren?

    Du hast es kapiert. 👍

    Wie gibt's das dann, dass das Beispiel von Athar kompiliert!?



  • dot schrieb:

    Sone schrieb:

    Wie oft denn noch? schrieb:

    knivil schrieb:

    Btw. Der Beitrag von Sone ist jetzt nicht so daneben.

    Also können Referenzen immer nur gültige Objekte referenzieren?

    Du hast es kapiert. 👍

    Wie gibt's das dann, dass das Beispiel von Athar kompiliert!?

    Ok. Dann eben so: In einem wohldefinierten Programm gibt es nur gültige Referenzen.

    Edit: Na gut, dann kann es in einem wohldefiniertem Programm eben ungültige Referenzen geben. Nach wie vor ist das hier richtig:

    std::string a = "Hello World!"; //a ist intern ein konstanter Zeiger auf einen std::string irgendwo auf dem Stack
    


  • Sone schrieb:

    Nach wie vor ist das hier richtig:

    std::string a = "Hello World!"; //a ist intern ein konstanter Zeiger auf einen std::string irgendwo auf dem Stack
    

    Nein, ist es nicht. In Java hättest du recht, in C++ nicht. a ist wirklich ein std::string und kein Zeiger. Ein Zeiger auf a existiert nicht, auch nicht intern. Sonst würden auch alle Variablen 4 oder 8 Bytes extra Speicher kosten.



  • Hat dieser Sone überhaupt was kapiert? Was stimmt mit ihm nicht? So schlecht kann man sich doch nicht auskennen, und wenn dann hält man wenigstens den Mund.

    @Sone: Wie wäre es wenn du dich mal mit den absoluten Grundlagen von C++ beschäftigst? Und wenn du dies schon einmal getan hast mache es nochmal und wenn es dann immer noch nicht sitzt nochmal usw. Ist halt nicht jeder zum Programmierer geboren, was wohl auf dich zu trifft. Anders kann ich mir die Inkompetenz nicht erklären, oder ist dein Name Jürgen Wolf?



  • Swordfish schrieb:

    knivil schrieb:

    Btw. Der Beitrag von Sone ist jetzt nicht so daneben.

    Also ist t1 eine Referenz?

    Nein :).



  • Vielen, vielen Dank für die Klarstellung, knivil! 👍 😃



  • Nochmal meine 2 cents dazu:

    Ich arbeite mit fremdem Code (bspw. eine externe Lib), und bekomme von einer Methode eine Referenz zurück. Dann gehe ich davon aus, dass diese auch gültig ist - schlicht und einfach deswegen, weil ich eine Referenz nicht auf Gültigkeit überprüfen kann. Natürlich kann es vorkommen, dass da jemand Mist gebaut hat und eine ungültige Referenz liefert. Aber mit der Signatur "Ich gebe eine Referenz zurück" sagt er mit implizit, "und diese Referenz ist gültig.". Wenn ich dagegen einen Pointer bekomme, dass muss ich diesen überprüfen.

    Soweit die Regel, Abweichungen davon müssen in der Methodendokumentation stehen, bspw. "Die zurückgegebene Referenz ist ungültig, solange nicht 'ConnectToDatabase()' aufgerufen wurde."



  • daddy_felix schrieb:

    Wenn ich dagegen einen Pointer bekomme, dass muss ich diesen überprüfen.

    Das geht aber auch nur dann, wenn das ein null pointer ist, d.h. explizit gekennzeichnet wurde, dass er auf kein Objekt zeigt.



  • [Rewind] schrieb:

    daddy_felix schrieb:

    Wenn ich dagegen einen Pointer bekomme, dass muss ich diesen überprüfen.

    Das geht aber auch nur dann, wenn das ein null pointer ist, d.h. explizit gekennzeichnet wurde, dass er auf kein Objekt zeigt.

    ja, ein Pointer kann auch auf ein ungültiges Objekt zeigen. ist dann wie bei der ungültigen Referenz mies programmiert.



  • daddy_felix schrieb:

    ja, ein Pointer kann auch auf ein ungültiges Objekt zeigen. ist dann wie bei der ungültigen Referenz mies programmiert.

    Und was (Neues) wolltest du damit sagen?



  • [Rewind] schrieb:

    daddy_felix schrieb:

    ja, ein Pointer kann auch auf ein ungültiges Objekt zeigen. ist dann wie bei der ungültigen Referenz mies programmiert.

    Und was (Neues) wolltest du damit sagen?

    ich wollte einfach nur nochmal erwähnen, dass die Semantik einer Referenz aussagt "ich bin gültig", während das bei einem Pointer eben nicht so ist.

    Entschuldigung, wenn das in den bisherigen Posts bereits in dieser Form klargestellt wurde, dann habe ich das wohl übersehen.



  • nwp3 schrieb:

    Sone schrieb:

    Nach wie vor ist das hier richtig:

    std::string a = "Hello World!"; //a ist intern ein konstanter Zeiger auf einen std::string irgendwo auf dem Stack
    

    Nein, ist es nicht. In Java hättest du recht, in C++ nicht. a ist wirklich ein std::string und kein Zeiger. Ein Zeiger auf a existiert nicht, auch nicht intern. Sonst würden auch alle Variablen 4 oder 8 Bytes extra Speicher kosten.

    Wenn du auf eine Instanz zugreifen willst, dann musst du wissen wo diese im Speicher liegt. Du kannst sie nicht herzaubern. Du musst wissen wo sie liegen. Und a ist intern ein Zeiger.

    Und zum extra Speicherplatz: Du kannst überhaupt nicht prüfen, wie viel Speicherplatz eine Variable wirklich beansprucht. Du kannst nur wissen, wie viel die Instanz einer Klasse im Speicher braucht; Aber nicht, wie viel a kostet. Auf jeden Fall musst du die Adresse der Instanz irgendwo haben.


  • Mod

    Sone schrieb:

    Wenn du auf eine Instanz zugreifen willst, dann musst du wissen wo diese im Speicher liegt. Du kannst sie nicht herzaubern. Du musst wissen wo sie liegen. Und a ist intern ein Zeiger.

    Boah, Sone! Hast du mittlerweile nicht sogar schon Post vom Großadministrator bekommen? Solch einen Unsinn habe ich selbst hier im Forum noch nie gesehen. Und du weißt, dass hier so einiges kommt.


Anmelden zum Antworten