Definition: Zeiger & Referenzen
-
Schon passiert

-
Schon passiert

Würde eigentlich folgender Satz stimmen?:Überall wo eine Referenz verwendet werden kann, nehme eine Referenz, denn diese sind wesentlich ungefährlicher als Zeiger.
-
Hi,
finde Dein Anliegen und den Inhalt auch gut. Ein kleiner Hinweis:
777 schrieb:
...Eine Referenz ist eine eigenständige Variable, ...
Das würde ich anders formulieren. Mit "Variable" assoziiere ich (und da bin ich vielleicht auch nicht der Einzige) adressierbare Objekte ... und das sind Referenzen nunmal nicht.
Schon eher kann man Referenzen als "Aliasse" bezeichnen und ihre Namen als "Bezeichner".Gruß,
Simon2.
-
Jap.
Im Prinzip hast du da sogar recht... ich änder das mal noch x.x.
-
Hi 777,
schoen dass sich mal jemand die Muehe macht
Einige Anmerkugnen:777 schrieb:
Wird die Variable zerstört auf die die Referenz verweist, wird auch die Referenz zerstört.
"...wird die Referenz ungueltig. Ein Zugriff auf eine ungueltige Referenz erzeug undefiniertes Verhalten" - so wuerde ichs sagen

Über den Adressoperator '&' kann auf die Speicherstelle zugegriffen werden.
hat eben nichts mit der Referenz zu tun. Oder moechtest du damit ausdruecken, dass der Adressoperator, angewendet auf eine Referenz, wie alle anderen Operatoren und Funktionen auf das referenzierte Objekt wirkt und daher dessen Adresse zurueckgibt?
Zeiger werden mit Hilfe des Diferenzierungsoperators '*' definiert.
Bei der Deklaration von Zeigern ist der '*' eben kein Dereferenzierungsoperator, genauso wenig wie das & bei der Referenzendeklaration etwas mit dem Adressoperator oder dem bitand-operator zu tun hat
Der Asterisk ist in dem Fall teil des Typs.Wird mit der delete-Anweisung ein Objekt zerstört auf welches ein Zeiger zeigt, so kann mit diesem Zeiger immer noch auf das Objekt zugegriffen werden.
Das Objekt wird zerstoert und der Speicher freigegeben. Der Zugriff auf Speicher, der nicht (mehr) dem Prozess gehoert, erzeugt meist einen Absturz. Wird das Objekt zerstoert, ohne dass der Speicher freigegeben wird, (Aufruf des Destruktors: ptr->~Object()), so gehoert der Speicher zwar noch dem Prozess, aber der Versuch, diesen Speicher als Existierendes Objekt zu behandeln erzeugt undefiniertes Verhalten (das gilt soweit ich weiss auch fuer Aufrufe von delete)
-
777 schrieb:
Referenzen:
Definition: Eine Referenz ist ein Synonym oder Alias für eine andere Variable an das sie gebunden ist.
"an *die* sie gebunden ist".
Sie belegt also bei ihrer Declaration nicht sehr viel Speicherplatz.
Deklaration. Wieviel ist "nicht sehr viel"?
777 schrieb:
Eine Referenz muss direkt bei der initialisierung definiert werden, was bedeutet, dass sie während ihrer Lebenszeit IMMER auf ein Objekt und immer auf das selbe Objekt verweist.
Initialisierung.
Eine Initialisierung ist immer eine Definition, deshalb ist der Satz ungünstig. Eher:
"Eine Referenz muss immer initialisiert werden, was bedeutet, dass sie an ein Objekt gebunden wird. Diese Bindung kann nachträglich nicht mehr verändert werden."Eine Referenz verweist also immer auf die selbe Stelle im Speicher.
Über den Adressoperator '&' kann auf die Speicherstelle zugegriffen werden.
Sonst kann die Referenz rein syntaktisch genau, wie die Variable verwendet werden auf welche sie verweist.Ebenenwechsel. Ich würde statt Speicherstelle lieber Variable verwenden.
Also:
Eine Referenz verweist also immer auf die selbe Variable.
Über den Adressoperator '&' kann auf die Speicherstelle dieser Variable zugegriffen werden...Referenzen sind hilfreich, wenn es beispielsweise darum geht Werte an eine private Funktion zu übergeben.
Wenn es darum geht *Werte* zu übergeben, verwendet man eigentlich gerade keine Referenzen.
Es wird immer dann eine Referenz übergeben, wenn ihre Schwestervariable sich ändern soll und keine Kopie ihrer Schwestervariable geändert werden soll.
Schwestervariable?
Wird die Variable zerstört auf die die Referenz verweist, wird auch die Referenz zerstört.
Nope. Die Lebenszeit einer Variable ist i.A. unabhängig von ihren Referenzen. Wenn eine Variable stirbt, es aber noch Referenzen auf diese Variable gibt, so sind diese Referenzen ungültig (dangling reference).
Zeiger:
Zeiger sind direkte Adressen, welche an bestimmte Speicherbereiche gebunden sind. Dieser Speicherbereich kann sich während ihrer Lebenszeit auch ändern. Das bedeutet, dass es kein Problem ist mit Zeigern auch arithmetische Operationen durchzuführen.
Das ist imo sehr verwirrend. Zeiger sind vorallem erst mal Variablen und besitzen demzufolge eine (unveränderliche) Speicheradresse. Sie verweisen auf andere Variablen (Speicheradressen) und dieser Verweis kann verändert werden. Soweit hat das aber noch nichts mit Pointerarithmetik zu tun.
Ein Zeiger kann also nicht am Programmanfang auf einen integer Zeigen und im späteren Verlauf auf einen Double.
"auf einen Integer zeigen".
Zeiger sind, weil sich mit ihnen vielfältigere Sachen tuen lassen aber auch schwerer zu programmieren und es muss auf Fehleranfälligkeit des Programmes geachtet werden, da es passieren kann, dass ein Zeiger auf eine Stelle im Arbeitsspeicher zeigt, welche vom Betriebssystem für einen Anderen Prozess vorgesehen war.
Zeiger sind, ..., aber...
für einen anderen Prozess...
Ich würde den kompletten Satz streichen, da er nicht wirklich etwas mit der Definition von Zeigern zu tun hat.In einem solchen Fall kommt es meistens zu einem absoluten Programmabsturz.
Gibt es auch relative Programmabstürze?
Zeiger überleben zudem die Zerstörung von Objekten, auf welche sie zeigen.
Wird mit der delete-Anweisung ein Objekt zerstört auf welches ein Zeiger zeigt, so kann mit diesem Zeiger immer noch auf das Objekt zugegriffen werden.Nope. Der Zugriff auf eine nicht mehr existierende Variable über einen Zeiger ist Leichenflädderei und damit überall dort, wo der C++ Standard gilt, illegal.
Da Zeiger nicht immer auf ein Objekt zeigen müssen wird im Programmierergenrè der Zeiger nachdem er nicht mehr benutzt wird, dem Programmmierer jedoch bewusst ist, dass der Zeiger im späteren Programmverlauf noch einmal an Bedeutung gewinnt auf die Adresse 0 gesetzt.
Das Zeigt Beispielsweise andereren Programmierern, welche den Quelltext verstehen wollen, dass dieser Zeiger im Moment keine Verwendung findet. (Edit)Würde ich komplett streichen und durch einen einfachen Hinweis auf die Existenz
des Nullpointers ersetzen.
-
777 schrieb:
Über den Adressoperator '&' kann auf die Speicherstelle zugegriffen werden.
Ist vielleicht etwas unglücklich ausgedrückt, da man mit dem Adressoperator ja die Adresse der Variable bzw. die Speicherstelle erhält.
Wird die Variable zerstört auf die die Referenz verweist, wird auch die Referenz zerstört.
Eigentlich müssten Referenzen sich hier wie Zeiger verhalten, daher kann man auch nach einem delete versuchen, auf die Speicherstelle mit Hilfe der Referenz zuzugreifen, was u.U. eine Zugriffsverletzung zur Folge hat.
Zeiger werden mit Hilfe des Diferenzierungsoperators '*' definiert.
Redet man in diesem Zusammenhang auch von einem Dereferenzierungsoperator oder überhaupt von einem Operator? Bin mir hier nicht ganz sicher.
welche vom Betriebssystem für einen Anderen Prozess vorgesehen war.
Aber nur wenn es keinen virtuellen Speicher gibt.
Wird mit der delete-Anweisung ein Objekt zerstört auf welches ein Zeiger zeigt, so kann mit diesem Zeiger immer noch auf das Objekt zugegriffen werden.
Oder eben auch nicht, falls die entsprechende Seite im Speicher dabei freigegeben wurde.
Da Zeiger nicht immer auf ein Objekt zeigen müssen wird im Programmierergenrè der Zeiger nachdem er nicht mehr benutzt wird, dem Programmmierer jedoch bewusst ist, dass der Zeiger im späteren Programmverlauf noch einmal an Bedeutung gewinnt auf die Adresse 0 gesetzt.
Das Zeigt Beispielsweise andereren Programmierern, welche den Quelltext verstehen wollen, dass dieser Zeiger im Moment keine Verwendung findet. (Edit)Hier würde ich noch ergänzen, dass die Dereferenzierung eines Nullzeigers zuverlässig zu einer Zugriffsverletzung führt, was die Fehlersuche stark erleichtert, wenn der Programmablauf mal eine Route einschlägt, mit der man nicht gerechnet hat.
Edit: hab ich scheinbar etwas zu spät gepostet
-
HumeSikkins schrieb:
In einem solchen Fall kommt es meistens zu einem absoluten Programmabsturz.
Gibt es auch relative Programmabstürze?
Windows: Absolute Programmabstürze
Linux: Relative Programmabstürze
-
HumeSikkins schrieb:
Leichenflädderei
Leichenfledderei, wenn wir schon bei der Rechtschreibung angelangt sind *scnr*

-
pumuckl schrieb:
HumeSikkins schrieb:
Leichenflädderei
Leichenfledderei, wenn wir schon bei der Rechtschreibung angelangt sind *scnr*

Oha. Danke für den Hinweis.
-
Oha... ich werd meinen Artikel wohl nochmal überarbeiten müssen... werd das bei Zeiten hier dann das Ergebnis posten.
cya
David
-
Randfrage: Soll das ein Artikel für unser Magazin werden? Wenn ja, melde dich mal bitte bei estartu, damit sie dich in die Redaktion aufnehmen kann.
-
Kann das nicht einfach in die FAQ? Für einen Magazin-Artikel würden ja noch Anwendungsbeispiele usw fehlen. Nicht falsch verstehen, ich find's wirklich _super_, dass 777 das angegangen ist, weil dieses Thema vielen schwerfällt, aber in der FAQ müsste es doch perfekt aufgehoben sein..?
Eventuell könnte man auch den Link auf Binky mit dazunehmen?
-
Hey,
Ich hab den Artikel jetzt nochmal nach euren Kriterien bearbeitet.
Wenn ihr meint, dass es wichtig ist sowas in die FAQ dazuzunehmen kann ich das gut verstehen, weil ich den Unterschied zwischen Zeigern und Referenzen selbst etwas schwammig gefunden habe und in keinem Forum eine genaue Definition lag.
Beispiele sollten ja nicht soo das große Problem sein