Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Frage zu NEW(Pointer)
delphisual - Mi 09.07.03 16:00
Titel: Frage zu NEW(Pointer)
Hallo und danke für das Reinschauen,
1. ich habe eine Frage die mich beschäftigt, den überall lese ich, dass der Pointer einen Speicher von 4 Byte benötigt, durch die Procedure New() erzeuge ich eine dynamische Variable die genau so groß ist wie der Datentyp auf dem ich referenziere. ich habe einfache Pointer ausprobiert und es funktioniert ohne der Eingabe von NEW(Pointer), also wann genau muss ich die procedure New(Pointer) einsetzen?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| var P : ^integer; B : integer; Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject); begin B:=100; P:= @B; label1.Caption:=Format('Wert von P: %d',[(P^)]); end; |
funktioniert
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| var P : ^integer; B : integer; Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject); begin new(P); B:=100; P:= @B; label1.Caption:=Format('Wert von P: %d',[(P^)]); end; |
funktioniert auch !
ich freue mich auf jede Antwort! DANKE!!!!!!!!!
Klabautermann - Mi 09.07.03 16:07
Hallo,
in deinem Beispiel reserviest du den Speicher nich per
New sondern über das
Dein Pointer referenziert dann nur den Speicher, der durch die obrige Variablemdeklaration Reserviert wurde.
Wenn du New verwendest kannst du auf die Deklatation von B verzichten.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| var P : ^integer; Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject); begin NEW(P); TRY p^:=100; label1.Caption:=Format('Wert von P: %d',[(P^)]); FINALLY Dispose(p); END; end; |
Gruß
Klabautermann
AndyB - Mi 09.07.03 16:07
Titel: Re: Frage zu NEW(Pointer)
| delphisual hat folgendes geschrieben: |
| Typisiert |
Es heißt
dereferenzieren.
| Zitat: |
| new(P); // Bitte sagt mir was sich jetzt geändert hatt |
Du hast ein Speicherleck von 4 Bytes geschaffen.
Mit New(P) reservierst du Speicher auf den der Zeiger P danach zeigt. Diesen Speicher musst du mit Dispose(P) wieder freigeben.
Anstatt dem
kannst du auch
Delphi-Quelltext
1:
| GetMem(P, SizeOf(Integer)); |
schreiben. Dann solltest du statt Dispose(P) aber FreeMem(P) aufrufen.
Für deinen Code ist der New-Aufruf nutzlos, da du den Zeiger mit P := @B auf den Speicherbereich an dem B liegt umbiegst. Der alte Wert, der von New zugewiesen wurde, geht verloren.
New() und Dispose() werden häufig bei verketteten Listen eingesetzt, wo man nicht weiß wieviel Elemente noch kommen können.
delphisual - Mi 09.07.03 16:51
genau das wollte ich wissen, danke, danke, danke :D
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!