Thema: Delphi untypisierter pointer

Einzelnen Beitrag anzeigen

Muetze1
(Gast)

n/a Beiträge
 
#23

Re: untypisierter pointer

  Alt 20. Jan 2005, 14:16
Moin!

Zitat von Jan:
In delphi sind doch meines Wissens nach Variabeln auch nichts anderes als Zeiger auf einen Speicherinhalt.
Jede Instanzenvariable ist nur ein Zeiger auf das eigentliche Objekt (besser: die eigentliche Objektinstanz). Dieses trifft nicht für eine Variable vom Typ Integer, Record oder sonstiges zu - Ausnahme dabei sind alle die definierten Typen, die bei der Definition ein ^ vor dem Typ tragen. Also z.B. ist ein PByte definiert als Type PByte = ^Byte; und somit ein Zeiger auf ein Byte. Bei irgendwelchen Variablen die Objekte sind, sind es automatisch Zeiger.

Zitat von Jan:
Und ist es nicht auch so, dass wenn ich zwei Objekte a und b habe, dass dann
Delphi-Quellcode:
a:=b;
a:=nil;
auch b nil setzt?
Nein, warum sollte? Wie oben schon geschrieben sind diese Variablen eigentlich ein Zeiger auf den Speicherbereich wo die Instanz des Objektes liegt - also eigentlich ein normaler Pointer. Daher läuft das so ab, das a auf einen Speicherbereich zeigt und b z.B. auf die ungültige Adresse 00000000h. Danach weisst er bei der Zuweisung b keine Referenz zu, sondern b zeigt dann einfach auf den gleichen Speicherbereich. Das ist so als wenn du einem Pointer einen anderen zuweist - danach zeigen beide auf den gleichen Speicherbereich. Beide Variablen (a und b) bieten Platz für eine 32 Bit Adresse (daher ergibt SizeOf(a) bei beiden jeweils 4 Byte) - und beide haben ihren eigenen Speicherplatz von 4 Byte wo die sich diese Adresse drin merken. a liegt z.B. an Speicherstelle X und enthält als Adresse die Adresse einer Objektinstanz TT. Nun liegt Variable b an der Speicherstelle Y und enthält 0. Bei der Zuweisung werden einfach die 4 Byte der Variablen an der Speicherstelle Y mit dem gleichen Inhalt wie den der Speicherstelle X gleich gesetzt - also einmal umkopiert. Wenn du nun a Nil zuweist, dann wird in Speicherstelle X einfach eine 0 reingeschrieben - aber die Speicherstelle Y ist das doch egal - die hat nix mit a oder Speicherstelle X zu tun. Daher enthält danach die Speicherstelle Y immernoch den gleichen Inhalt.

Beispiel:
Delphi-Quellcode:
program TestReference;
{$APPTYPE CONSOLE}

uses sysutils;

Var
  a, b : TObject;

begin
  WriteLn('Objekte - Zuweisungsspiele');

  a := Nil;
  b := Nil;

  WriteLn('a = 0x', IntToHex(Integer(a), 8), ' b = 0x', IntToHex(Integer(b), 8));

  a := TObject.Create;

  WriteLn('a = 0x', IntToHex(Integer(a), 8), ' b = 0x', IntToHex(Integer(b), 8));

  b := a;

  WriteLn('a = 0x', IntToHex(Integer(a), 8), ' b = 0x', IntToHex(Integer(b), 8));

  FreeAndNil(a);

  WriteLn('a = 0x', IntToHex(Integer(a), 8), ' b = 0x', IntToHex(Integer(b), 8));

  ReadLn;
end.
Zitat von Jan:
Und nach dem Prinzip dachte ich würde auch das funktionieren:

Delphi-Quellcode:
temp:=tstringlist(listview1.selected.data);
      freeandnil(temp);
Data ist ein Zeiger, und jetzt wird die Speicheradresse meines Objekts an Temp übergeben. Durch freeandnil wird der Speicherbereich meines Objekts freigegeben.
Richtig - du schreibst es selber richtig - die Speicheradresse wird übergeben - also nur die Adresse wo der Inhalt liegt.

Zitat von Jan:
und demnach sollte dann auch
workarray[0]=nil true liefern und keine AV.
Wo genau ist da jetzt mein Fehler?
Der liegt genau an dem Punkt zu erkennen (bzw. mir zu glauben ), dass Data von der ListView1.Selected einen eigenen Speicherplatz für diese Adresse vorhält auf die er zeigt wie Temp - der auch seinen eigenen Speicherplatz für die Adresse vorhält. Nach der Zuweisung beinhalten aber beide Speicherplätze die selbe Zahl (Adresse), aber sie liegen an unterschiedlichen Stellen.

Wenn da immer Referenzen übergeben werden würden, dann müsste man ja mehr als höllisch aufpassen - wenn du dir irgendwo eine Zahl veränderst, an wieviel anderen Stellen auf einmal auch eine andere Zahl drinne steht.

MfG
Muetze1
  Mit Zitat antworten Zitat