Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Speicher für PChar allozieren und freigeben (https://www.delphipraxis.net/10373-speicher-fuer-pchar-allozieren-und-freigeben.html)

OLLI_T 17. Okt 2003 09:37


Speicher für PChar allozieren und freigeben
 
Moin Leute!

Warum funzt das hier:

Delphi-Quellcode:
Var pC:PChar;
Begin
  Getmem(pC,100);
  Zeromemory(pC,100);
  Freemem(pC);
End;
Und das hier nicht:

Delphi-Quellcode:
Var pC:PChar;
Begin
  Getmem(pC,100);
  pC:='Zensiert';
  Freemem(pC);
End;
Peinlich, ich weiss. Aber was mach ich falsch? Muss ich den allozierten Speicher etwa gar nicht freigeben? Wer kann mir das bitte mal in Ruhe an nem Beispiel erläutern.

Vielen Dank im Vorraus

OLLI

jbg 17. Okt 2003 10:00

Re: Speicher für PChar allozieren und freigeben
 
Zitat:

Zitat von OLLI_T
funzt

Nähere Bedeutung bitte!


Zitat:

Delphi-Quellcode:
Var pC:PChar;
begin
  Getmem(pC,100);
  Zeromemory(pC,100);
  Freemem(pC);
End;

Und was geht daran nicht?

Zitat:

Delphi-Quellcode:
Var pC:PChar;
Begin
  Getmem(pC,100);
  pC:='Zensiert';
  Freemem(pC);
End;

Du reservierst hier Speicher, auf den pC dann zeigt und überschreibst den Wert von pC mit dem Zeiger, den der Compiler für 'Zensiert' erzeugt hat. Danach versuchst du den schreibgeschützten Zeiger, der nicht dem Wert entspricht, den GetMem zurückgeliefert hat, freizugeben.
Einem PChar weist man Strings nicht so zu, außer du weißt, dass er konstant (schreibgeschützt) sein soll, dann darfst du aber auch keinen Speicher reservieren oder freigeben.


Delphi-Quellcode:
GetMem(pC, 100);
StrCopy(pC, 'Zensiert');
FreeMem(pC);
Die beiden Zeilen
Delphi-Quellcode:
  Getmem(pC,100);
  Zeromemory(pC,100);
kann man auch so schreiben:
Delphi-Quellcode:
pC := AllocMem(100);

OLLI_T 17. Okt 2003 11:24

Re: Speicher für PChar allozieren und freigeben
 
Vielen vielen Dank, Andy!

Zitat:

Du reservierst hier Speicher, auf den pC dann zeigt und überschreibst den Wert von pC mit dem Zeiger, den der Compiler für 'Zensiert' erzeugt hat. Danach versuchst du den schreibgeschützten Zeiger, der nicht dem Wert entspricht, den GetMem zurückgeliefert hat, freizugeben.
Gerade ist es mir wie Schuppen aus den Haaren ... :wall:

Zu meiner Ehrenrettung muss ich sagen, dass ich das Beispiel etwas vereinfacht hatte. Ursprünglich hatte ich folgenden Code, also keine String Konstante:

Delphi-Quellcode:
GetMem(pC,100);
pC0:=pC; // ursprünglichen Zeiger sichern
pC:=PChar(AText); // Das ist der Bock!
While StrLen(pC)>0 Do Begin
  ...
  Inc(pC); // pC bis zum bittern Ende hochzählen
End;
Freemem(pC0); // Hier hat´s geknallt
Hier hab ich wohl den Zeiger von pC auf den Speicherbereich von AText geändert. :oops:

Jetzt geht es wie geschmiert!

Viele Grüsse + schönes WE

OLLI

Wormid 17. Okt 2003 11:53

Re: Speicher für PChar allozieren und freigeben
 
Zitat:

Zitat von OLLI_T
Delphi-Quellcode:
  ...
  Inc(pC); // pC bis zum bittern Ende hochzählen
...

:gruebel:

Man macht sowas? Ich meine, bis vorhin wusste ich noch gar nicht, das das funktioniert. Aber zählt man wirklich Zeiger auf Speicherbereiche hoch? Are there no unwanted side effects?

Gruß

Wormid

Christian Seehase 17. Okt 2003 12:15

Re: Speicher für PChar allozieren und freigeben
 
Moin Wormid,

geht manchmal gar nicht anders.
Solange man sich dabei nicht den Pointer auf den eventuell noch freizugebenden Speicher zerstört (wie Olli es gemacht hat), sondern sich für die Schleife den Pointer zwischenspeichert, und man eine korrekte Abbruchbedingung hat, ist das kein Problem.

Such' hier doch mal nach Hier im Forum suchenNetServerEnum, oder Hier im Forum suchenNetWkstaUserEnum (als Beispiele), da kann man so etwas gebrauchen.
Wichtig:
Ein typisierter Pointer wird beim inc automatisch um die Grösse der Struktur hochgezählt auf die er zeigt, als nicht unbedingt um 1

Weiter vertiefen sollten wir dieses Thema in diesem Thread aber nicht. Es wird zu sehr OT.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz