![]() |
Speicher für PChar allozieren und freigeben
Moin Leute!
Warum funzt das hier:
Delphi-Quellcode:
Und das hier nicht:
Var pC:PChar;
Begin Getmem(pC,100); Zeromemory(pC,100); Freemem(pC); End;
Delphi-Quellcode:
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.
Var pC:PChar;
Begin Getmem(pC,100); pC:='Zensiert'; Freemem(pC); End; Vielen Dank im Vorraus OLLI |
Re: Speicher für PChar allozieren und freigeben
Zitat:
Zitat:
Zitat:
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:
Die beiden Zeilen
GetMem(pC, 100);
StrCopy(pC, 'Zensiert'); FreeMem(pC);
Delphi-Quellcode:
kann man auch so schreiben:
Getmem(pC,100);
Zeromemory(pC,100);
Delphi-Quellcode:
pC := AllocMem(100);
|
Re: Speicher für PChar allozieren und freigeben
Vielen vielen Dank, Andy!
Zitat:
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:
Hier hab ich wohl den Zeiger von pC auf den Speicherbereich von AText geändert. :oops:
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 Jetzt geht es wie geschmiert! Viele Grüsse + schönes WE OLLI |
Re: Speicher für PChar allozieren und freigeben
Zitat:
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 |
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 ![]() ![]() 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 23:32 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