AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Speicher für PChar allozieren und freigeben
Thema durchsuchen
Ansicht
Themen-Optionen

Speicher für PChar allozieren und freigeben

Ein Thema von OLLI_T · begonnen am 17. Okt 2003 · letzter Beitrag vom 17. Okt 2003
Antwort Antwort
OLLI_T

Registriert seit: 13. Okt 2003
Ort: Nähe Wetzlar / Hessen
143 Beiträge
 
Delphi 5 Enterprise
 
#1

Speicher für PChar allozieren und freigeben

  Alt 17. Okt 2003, 09:37
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
No Pain No Gain!
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2

Re: Speicher für PChar allozieren und freigeben

  Alt 17. Okt 2003, 10:00
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:
pC := AllocMem(100);
  Mit Zitat antworten Zitat
OLLI_T

Registriert seit: 13. Okt 2003
Ort: Nähe Wetzlar / Hessen
143 Beiträge
 
Delphi 5 Enterprise
 
#3

Re: Speicher für PChar allozieren und freigeben

  Alt 17. Okt 2003, 11:24
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 ...

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.

Jetzt geht es wie geschmiert!

Viele Grüsse + schönes WE

OLLI
No Pain No Gain!
  Mit Zitat antworten Zitat
Benutzerbild von Wormid
Wormid

Registriert seit: 26. Aug 2003
Ort: Steinfurt
292 Beiträge
 
Delphi XE2 Professional
 
#4

Re: Speicher für PChar allozieren und freigeben

  Alt 17. Okt 2003, 11:53
Zitat von OLLI_T:
Delphi-Quellcode:
  ...
  Inc(pC); // pC bis zum bittern Ende hochzählen
...


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
Debuggers don't remove Bugs, they only show them in Slow-Motion.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Speicher für PChar allozieren und freigeben

  Alt 17. Okt 2003, 12:15
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:42 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