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;  // Der Zeiger wird nicht Typisiert
    B : integer;
  Form1: TForm1;

implementation

{$R *.DFM}



procedure TForm1.Button1Click(Sender: TObject);
begin
    B:=100;
    P:= @B;  // Die Adresse mitteilen,
    label1.Caption:=Format('Wert von P: %d',[(P^)]); //Vor der ausgabe muss man  den  Pointer Typisieren.
end;

funktioniert

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
var P : ^integer;  // Der Zeiger wird nicht Typisiert
    B : integer;
  Form1: TForm1;

implementation

{$R *.DFM}



procedure TForm1.Button1Click(Sender: TObject);
begin
    new(P);  // Bitte sagt mir was sich jetzt geändert hatt
    B:=100;
    P:= @B;  // Die Adresse mitteilen,
    label1.Caption:=Format('Wert von P: %d',[(P^)]); //Vor der ausgabe muss man  den  Pointer Typisieren.
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

Delphi-Quelltext
1:
VAR B : Integer                    

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;  // Der Zeiger ist Typisiert auf Integer
  Form1: TForm1; 

implementation 

{$R *.DFM} 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
  NEW(P); // Speicher Reservieren
  TRY
     p^:=100// Einen Wert in den Reservierten Speicher schreiben
     label1.Caption:=Format('Wert von P: %d',[(P^)]); //Den Inhalt der Speicheradresse auf die P Zeigt Ausgeben.
  FINALLY
    Dispose(p); // Den Dynamisch Reservierten Speicher wieder frei geben
  END// TRY FINALLY
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

Delphi-Quelltext
1:
New(P);                    

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