Zeiger und Referenzen - was nehmen?



  • Ich beschäftige mich derzeit mit Zeigern und Referenzen.

    Dazu habe ich unter anderem diesen Thread gefunden:
    http://www.c-plusplus.net/forum/231254

    Es kam schon so rüber, als wären Referenzen praktischer/gebräuchlicher.
    Mir wurde jedoch nicht ersichtlich, wo man nun wirklich was einsetzt, worauf ich achten sollte etc, da viele geteilter Meinung sind, was das angeht.

    Der Threat ist zudem schon gute 3 Jahre alt, vielleicht hat sich seitdem quasi eine ungeschriebene Regel o.ä. gebildet 😃

    Hätte da gerne ein paar Meinungen zu, worauf ich mich eher konzentrieren sollte (da Anfänger).

    Ich danke Euch im Voraus. 🙂

    MfG

    Stryke



  • Fürs erste kannst du mal noch das durchlesen: http://www.c-plusplus.net/forum/308500-full?highlight=zeiger+referenz



  • Verdammt noch mal, das ist das häufigste Thema hier...

    Referenzen

    benutzt du um eine einmalige Referenz auf etwas zu haben - eine Referenz nimmst du, wenn du sicher gehen willst, dass die Referenzierung immer gültig ist (vgl. Pointer-Checks). Vorteil: Immer gültig, Bugs entstehen nie durch Referenzen an sich. Nachteil: Muss bei Definition initialisiert werden und referenziert für immer nur dieses Objekt.

    Pointer

    (Zeiger) sind einfach nur integrale Basisdatentypen, die eine Adresse speichern. Auf was diese zeigt ist nie ganz gewiss. Vorteile: Man muss nicht bei Definition initialisieren. Es können nacheinander verschiedene oder auch keine Objekte referenziert werden. Nachteil: Oft führt viel Pointer-gefummel zu Bugs, da man nie sicher sein kann ob Pointer gültig sind (sehr oft verursachen ungültige Pointer bei Zugriff einen SIGSEGV, Segmentation Fault, google das mal). Außerdem müssen öfter Null-Checks (→ ggf. Assertions) durchgeführt werden, um zu garantieren dass der folgende Code nicht einfach abstürzt, obwohl das auch nur was bringt wenn man die Zeige ordentlich mit Null initialisiert .

    Auf jeden Fall ist nicht eines besser als das andere.

    P.S.: Mit Referenz meine ich oben zum Teil auch allgemeine Referenzierungen.



  • Beispiel für Referenzen:

    void print(std::string const& str)
    {
        std::cout << str;
    }
    

    Man will hier ein definitiv gültige (allgemeine) Referenz, damit nicht kopiert wird. Also: Referenzen (mit const-specifier, weil du den string ja nicht modifizieren musst und das const einige Vorteile bei der Parameterübergabe hat).

    Beispiel für Zeiger: Ein Member in einer Klasse, der auf etwas zeigt. Worauf er zeigt, kann per Setter gesetzt und per Getter abgefragt werden. Weil hier hintereinander verschiedene Objekte referenziert werden (können) müssen, muss hier ein Zeiger verwendet werden.



  • Geht es hier um die Parameterübergabe bei Funktionen oder generell Pointer/Referenzen?



  • Mach dir nicht einmal die Mühe, die Posts von Sone zu lesen, da steckt viel Falsches, Ungenaues und Irrelevantes drinnen.

    Lies dir lieber das durch, das ist kurz und korrekt: http://www.parashift.com/c++-faq/refs-vs-ptrs.html



  • Um meine Behauptung zu unterlegen:

    Sone schrieb:

    Referenzierung immer gültig ist (vgl. Pointer-Checks)

    Meinst du Dereferenzierung?

    Sone schrieb:

    Bugs entstehen nie durch Referenzen an sich

    Gib mal eine Referenz auf ein lokales Objekt zurück.

    Sone schrieb:

    . Nachteil: Muss bei Definition initialisiert werden

    Wo ist da der Nachteil?
    Ausserdem: Weshalb können Klassen Referenzen als Member haben, obwohl bei der Definition nichts zugewiesen wird?

    Sone schrieb:

    Zeiger sind einfach nur integrale Basisdatentypen

    Warum kann man dann kein switch auf Pointer machen?

    Sone schrieb:

    Man muss nicht bei Definition initialisieren.

    Ist kein Vorteil und sollte auch nicht getan werden.

    Sone schrieb:

    sehr oft verursachen ungültige Pointer bei Zugriff einen SIGSEGV, Segmentation Fault, google das mal

    Passiert mir ziemlich selten.
    Häufiger ist insbesondere bei Anfängern ein Memory Leak. Und manchmal verändert man auch versehentlich Daten von einem anderen Teil des Programms.

    Sone schrieb:

    Außerdem müssen öfter Null-Checks (→ ggf. Assertions) durchgeführt werden, um zu garantieren dass der folgende Code nicht einfach abstürzt, obwohl das auch nur was bringt wenn man die Zeige ordentlich mit Null initialisiert .

    Mit Assertions stürzt der "Code" nicht ab?
    Zeiger, die mit 0 initialisiert sind, stellen wirklich das kleinste Problem dar.

    Sone schrieb:

    Auf jeden Fall ist nicht eines besser als das andere

    Super Ratschlag 🙄

    Sone schrieb:

    Beispiel für Zeiger: Ein Member in einer Klasse, der auf etwas zeigt. Worauf er zeigt, kann per Setter gesetzt und per Getter abgefragt werden. Weil hier hintereinander verschiedene Objekte referenziert werden (können) müssen, muss hier ein Zeiger verwendet werden.

    Und schon hast du deinen Memory Leak. Hier wäre ein Hinweis auf Smart Pointer angebracht.



  • seriöseantwort schrieb:

    Um meine Behauptung zu unterlegen:

    Sone schrieb:

    Referenzierung immer gültig ist (vgl. Pointer-Checks)

    Meinst du Dereferenzierung?

    Hmm. Ja.

    seriöseantwort schrieb:

    Sone schrieb:

    Bugs entstehen nie durch Referenzen an sich

    Gib mal eine Referenz auf ein lokales Objekt zurück.

    👍 Gutes Beispiel (ehrlich :D)

    seriöseantwort schrieb:

    Sone schrieb:

    . Nachteil: Muss bei Definition initialisiert werden

    Wo ist da der Nachteil?

    Kann ein Nachteil sein.

    seriöseantwort schrieb:

    Ausserdem: Weshalb können Klassen Referenzen als Member haben, obwohl bei der Definition nichts zugewiesen wird?

    Memberreferenzen müssen im Ctor initialisiert werden. Eine bessere Definition ist: Eine Referenz muss gültig initialisiert werden.

    seriöseantwort schrieb:

    Sone schrieb:

    Zeiger sind einfach nur integrale Basisdatentypen

    Warum kann man dann kein switch auf Pointer machen?

    Es ist syntaktisch verboten, weil es NULL Sinn macht einen Pointer mit einem Zeigerliteral zu vergleichen.

    seriöseantwort schrieb:

    Sone schrieb:

    Man muss nicht bei Definition initialisieren.

    Ist kein Vorteil und sollte auch nicht getan werden.

    Na gut. Ist eine Eigenschaft. So besser? Außerdem, natürlich kann man einen Pointer nur mit Null initialisieren. Wieso sollte das nicht getan werden?

    seriöseantwort schrieb:

    Sone schrieb:

    sehr oft verursachen ungültige Pointer bei Zugriff einen SIGSEGV, Segmentation Fault, google das mal

    Passiert mir ziemlich selten.
    Häufiger ist insbesondere bei Anfängern ein Memory Leak. Und manchmal verändert man auch versehentlich Daten von einem anderen Teil des Programms.

    Ja, das gehört dazu.

    seriöseantwort schrieb:

    Sone schrieb:

    Außerdem müssen öfter Null-Checks (→ ggf. Assertions) durchgeführt werden, um zu garantieren dass der folgende Code nicht einfach abstürzt, obwohl das auch nur was bringt wenn man die Zeige ordentlich mit Null initialisiert .

    Mit Assertions stürzt der "Code" nicht ab?
    Zeiger, die mit 0 initialisiert sind, stellen wirklich das kleinste Problem dar.

    Mit Assertions wird das Programm sauberer terminiert (und man weiß genau wo und wieso) als bei einem crash.

    seriöseantwort schrieb:

    Sone schrieb:

    Auf jeden Fall ist nicht eines besser als das andere

    Super Ratschlag 🙄

    Eine der wenigen guten Antworten. 👍

    seriöseantwort schrieb:

    Sone schrieb:

    Beispiel für Zeiger: Ein Member in einer Klasse, der auf etwas zeigt. Worauf er zeigt, kann per Setter gesetzt und per Getter abgefragt werden. Weil hier hintereinander verschiedene Objekte referenziert werden (können) müssen, muss hier ein Zeiger verwendet werden.

    Und schon hast du deinen Memory Leak. Hier wäre ein Hinweis auf Smart Pointer angebracht.

    Welcher Memory Leak? Du Lappen, lern lesen! Wo war von Speicherverwaltung die Rede? Und schau dir mal ein paar 3D-APIs an. Wo sind da Smart-Pointer?



  • Boa Sone bist du schlecht, ich hoffe du macht dein Hobby nie zum Beruf denn berufen bist du ganz bestimmt nicht dafür.



  • Wo war von Speicherverwaltung die Rede? Und schau dir mal ein paar 3D-APIs an. Wo sind da Smart-Pointer?

    Smartpointer sind eben noch relativ neu. Was willst Du mit Deinem 3D-API-Vergleich sagen? Smartpointer machen durchaus häufig auch in 3D-APIs Sinn.



  • Eisflamme schrieb:

    Wo war von Speicherverwaltung die Rede? Und schau dir mal ein paar 3D-APIs an. Wo sind da Smart-Pointer?

    Smartpointer sind eben noch relativ neu. Was willst Du mit Deinem 3D-API-Vergleich sagen? Smartpointer machen durchaus häufig auch in 3D-APIs Sinn.

    Es geht um eine einfache Referenzierung eines Objektes. Wozu zum Teufel brauchst du da Smart-Pointer? Wo war von Speicherverwaltung überhaupt die Rede? Das Beispiel war total angebracht.



  • Für mich klang das einfach nur so, dass Du sagen wolltest, in 3D-APIs gäbe es keine Smartpointer. Keine Ahnung, wie diese Aussage im Zusammenhang mit dem Vorherigen stehen soll.



  • Eisflamme schrieb:

    Für mich klang das einfach nur so, dass Du sagen wolltest, in 3D-APIs gäbe es keine Smartpointer. Keine Ahnung, wie diese Aussage im Zusammenhang mit dem Vorherigen stehen soll.

    Intern gibt es bei 3D-Engines bei vielen Klassen rohe Zeiger. Ich habe mir doch die Implementierungen angesehen.



  • Ja, weil Smartpointer eben relativ neu sind. Frag doch Mal dot, was er dazu sagt. Der wird Dir zig Beispiele nennen können, wo Smartpointer bei 3D-Engines Sinn ergeben und auch eingesetzt werden.

    Es ist klar, dass das noch nicht der Fall ist, weil es sich erst durchsetzen muss. Aber was wolltest Du mit Deinem Beispiel sagen? Dass das Argument, dass der Hinweis auf Smartpointer angebracht sei, nicht gültig ist, weil es Anwendungen gibt, wo es ohne verwendet wird? Das wäre ein schwaches Gegenargument.



  • Eisflamme schrieb:

    Es ist klar, dass das noch nicht der Fall ist, weil es sich erst durchsetzen muss. Aber was wolltest Du mit Deinem Beispiel sagen? Dass das Argument, dass der Hinweis auf Smartpointer angebracht sei, nicht gültig ist, weil es Anwendungen gibt, wo es ohne verwendet wird? Das wäre ein schwaches Gegenargument.

    Nein, weil es Fälle gibt wo es nicht um Manuelle Speicherverwaltung sondern nur um eine simple Referenzierung geht. Kapiescht? Da braucht man keine Smart-Pointer. Die sind da einfach völlig Fehl am Platz.



  • Spar Dir Mal bitte deinen kindischen Fettdruck.

    Und schau dir mal ein paar 3D-APIs an. Wo sind da Smart-Pointer?

    Aus der Aussage geht nicht hervor, dass es sich um reine Referenzierungen handelt, auch wenn das davor das Thema war. Formuliere doch einfach Mal genauer, dann gibt Dir nicht (berechtigterweise) jeder einen drauf.

    Mir ging es nicht Mal darum Dich zu belehren, sondern darum, dass irgendwelche Anfänger, die hier lesen, nicht plötzlich irgendeiner falschen Auffassung sind.

    Wobei dadurch natürlich auch durch so was wie

    Mach dir nicht einmal die Mühe, die Posts von Sone zu lesen, da steckt viel Falsches, Ungenaues und Irrelevantes drinnen.

    Sorge getragen wird.

    Ich glaube, ich kommentiere einfach gar nichts mehr von Dir... Das soll jemand tun, vor dem Du Respekt hast, vielleicht benimmst Du Dich dem gegenüber.



  • Eisflamme schrieb:

    Mir ging es nicht Mal darum Dich zu belehren, sondern darum, dass irgendwelche Anfänger, die hier lesen, nicht plötzlich irgendeiner falschen Auffassung sind.

    Du sprichst mir aus der Seele 😃
    In dieser, nunja, Diskussion kamen jetzt einige neue Begriffe (und verschiedene Meinungen) hinzu.
    Es ist etwas mühsam, wenn man auf eine derart "schlicht gemeinte" Frage so viel Neues zu hören bekommt, was einem erst bei späterem/besserem Verständnis als einleuchtend erscheint. 😞

    Sone schrieb:

    [...]google das mal

    Ich kann von mir behaupten, dass ich wirklich alles google, was mir nichts sagt o.ä.

    xStrykex schrieb:

    Dazu habe ich unter anderem diesen Thread gefunden:
    http://www.c-plusplus.net/forum/231254

    Ich möchte dazu noch einmal das unter anderem betonen. Ich hätte auch Sämtliches posten können, doch für sehr hilfreich halte ich das nicht. Dabei hat mir der Verweis von out (mal wieder herzlichen Dank 🙂 ) geholfen, auf den ich bei der Suche z.B. nicht gestoßen bin.

    MfG

    Stryke

    PS: Vielleicht mag es eine häufige Frage sein, doch es wird immer Anfänger geben (und ich versuche jetzt schon zu helfen, soweit es mir irgend möglich ist), dabei gibt es widerum jene, die sich selbst kümmern und andere, die sich selbst kümmern, wozu ich mich gerne zählen möchte. Doch wenn man nichts ausreichend Hilfreiches findet, was tun? Dann frage ich halt nach, und dieses Forum scheint mir das kompetenteste und hilfreichendste zu sein. 🙂


Anmelden zum Antworten