![]() |
Versändnisfrage zu Pointern und Datenzuweisung
Hallo zusammen,
ich arbeteite seit einigen Tagen mit dem VirtualStringTree und muss mich deshalb auch mit Pointern beschäftigen. In den Tutorials zu Pointern habe ich gelernt dass eine Zuweisung durch eine Dereferenzierung geschehen muss:
Delphi-Quellcode:
Edit: Es war bei mir eher so:
EinPointer^ := Wert;
Delphi-Quellcode:
EinPointer^ := EinObjekt;
Nun hatte ich das Dach (^) mal vergessen und merkwürdigerweise funktionierte die Zuweisung ebenfalls problemlos. Ist das eine "großzügige" Einstellung in Delphi die sowas erlaubt? In den Optionen unter "Compiler" finde ich dahingehend jedoch nichts. Wäre einfach schön zu wissen warum das trotzdem funktionert. Dank und Gruß Pfoto |
Re: Versändnisfrage zu Pointern und Datenzuweisung
Eigendlich müsstest du damit dann den Pointer geändert haben...
...es sei dem Delphi hat wegen der Code-Optimierung keinen "richtigen" Pointer drausgemacht, sondern, da die zu speichernden Daten < 4 Byte sind zB, gleich den Wert in die Speicherstelle geschrieben... |
Re: Versändnisfrage zu Pointern und Datenzuweisung
Kommt natürlich darauf an als was dein Pointer Deklariert ist. Wenn Du den Pointer
als ^Integer (Pointer auf Integer) deklariert hast, gibt es dann bei einer Zuweisung eines anderen Integeren Wertes der ebenfalls ein Pointer ist, keine Probleme. Gruß gispos |
Re: Versändnisfrage zu Pointern und Datenzuweisung
Ich habe das hier deklariert:
Delphi-Quellcode:
PTreeData = ^TTreeData;
TTreeData = record TreeObj: TBaseTreeObj; end; Heißt das also im Klartext, nur wenn ich etwas größeres als einen Integer per Pointer deklariere, wäre eine Dereferenzierung notwendig? Mit der Dereferenzierung macht man den Compiler also nur darauf aufmerksam, das da mehr kommt als ein Integer? So ganz habe ich es wohl noch nicht verstanden... :gruebel: |
Re: Versändnisfrage zu Pointern und Datenzuweisung
mach einfach immer Pointer^ := ...also mit Dach.
Du weißt nicht ob das immer klappt und irgendwann hast du ne Zugriffsverletzung. |
Re: Versändnisfrage zu Pointern und Datenzuweisung
Außerdem ist es richtig ;) und Du siehst auch nach Jahren noch, dass Du hier einen Pointer dereferenzierst.
|
Re: Versändnisfrage zu Pointern und Datenzuweisung
Der Unterschied ist folgender:
Ohne Dereferenzierung (also ohne ^) änderst du die Adresse, auf die der Zeiger zeigt. Mit Dereferenzierung (also mit ^) änderst du den Inhalt, auf den der Zeiger zeigt. Wenn du einen Zeiger mit Getmem/New erzeugst und änderst die Adresse (ohne Dereferenzierung also), dann erzeugst du ein Memory-Leak, da du diesen Speicher angelegt hast, ihn aber nie wieder freigeben kannst (schließlich überschreibst du die Adresse). Also..immer schön ans ^ denken :) |
Re: Versändnisfrage zu Pointern und Datenzuweisung
Achso!
Es ging also nur deshalb, weil ich dem Pointer ein Objekt zugewiesen habe und damit ja auch wieder nur einen Pointer, also eine Adresse, verteilt habe. Danke Euch allen! Gruß Pfoto |
Re: Versändnisfrage zu Pointern und Datenzuweisung
Genau das ist so eine Sache ;) Objekte sind schon Pointer, aber Delphi verschleiert den Fakt recht gut.
|
Re: Versändnisfrage zu Pointern und Datenzuweisung
... und Delphi setzt die Dereferenzierung nicht mehr explizit voraus seit D6. Dort kann man den ^ auch weglassen. Folgendes ist ohne Probleme möglich:
Delphi-Quellcode:
type
PTest = ^TTest; TTest = record a: integer; b: integer; end; procedure Test; var lTest: PTest; begin New(lTest); try lTest.a := 4; lTest.b := lTest^.a; finally Dispose(lTest); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz