AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

pchar freigeben?

Ein Thema von mumu · begonnen am 15. Feb 2006 · letzter Beitrag vom 16. Feb 2006
Antwort Antwort
Seite 1 von 3  1 23      
mumu

Registriert seit: 28. Okt 2003
Ort: Bamberg
519 Beiträge
 
#1

pchar freigeben?

  Alt 15. Feb 2006, 11:34
muss man einen pchar eigentlich freigeben? und wenn ja, wie?

ich hab hier ein programm, bei dem der Programmierer jeden lokalen pchar am Ende der procedure auf nil gesetzt hat:
Delphi-Quellcode:
temp: PChar;
begin
...
temp:= nil
end;
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#2

Re: pchar freigeben?

  Alt 15. Feb 2006, 11:38
das setzen des Zeigers auf nil gibt keinen Speicher frei, damit kriegst du ein schönes Speicherleck. Das Gegenmittel heißt Delphi-Referenz durchsuchenFreeMem, das dir den reservierten Speicher einer Variable freigibt

greetz
Mike
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
mumu

Registriert seit: 28. Okt 2003
Ort: Bamberg
519 Beiträge
 
#3

Re: pchar freigeben?

  Alt 15. Feb 2006, 11:41
Zitat von JasonDX:
das setzen des Zeigers auf nil gibt keinen Speicher frei, damit kriegst du ein schönes Speicherleck. Das Gegenmittel heißt Delphi-Referenz durchsuchenFreeMem, das dir den reservierten Speicher einer Variable freigibt

greetz
Mike
jo das ist mir auch irgendwie klar. deshalb hab ich mich auch so gewundert... was der programmierer da macht.

ist FreeMem bei lokalen PCHars eigentlich nötig, oder macht delphi das nach ende der procedure selbst?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: pchar freigeben?

  Alt 15. Feb 2006, 11:46
Da PChar nur eine Zeigertyp ist (Zeiger auf einen Char) ist ein Freemem eigentlich nicht nötig. Man muß u.U. aber den Speicher der Struktur freigeben auf welchen der pchar gesetzt wurde.
Markus Kinzler
  Mit Zitat antworten Zitat
mumu

Registriert seit: 28. Okt 2003
Ort: Bamberg
519 Beiträge
 
#5

Re: pchar freigeben?

  Alt 15. Feb 2006, 11:48
Zitat von mkinzler:
Da PChar nur eine Zeigertyp ist (Zeiger auf einen Char) ist ein Freemem eigentlich nicht nötig. Man muß u.U. aber den Speicher der Struktur freigeben auf welchen der pchar gesetzt wurde.
jo genau, oki dann hat sich das erledigt. muss ich also nicht freigeben. das ich die strukturen freigeb, ist mir klar.

vielen dank
  Mit Zitat antworten Zitat
Benutzerbild von ste_ett
ste_ett

Registriert seit: 10. Sep 2004
Ort: Dülmen
464 Beiträge
 
Delphi 7 Professional
 
#6

Re: pchar freigeben?

  Alt 15. Feb 2006, 13:19
GetMem/FreeMem oder besser New/Dispose wird nur benötigt, wenn du z.B. PChars an Funktionen übergibst und diese den "Inhalt" des PChars verändern.
Stefan
"Geht nicht!" ist keine Fehlerbeschreibung und "Hab ich schon versucht!" keine Antwort!

Hey, it compiles! Ship it!
  Mit Zitat antworten Zitat
mumu

Registriert seit: 28. Okt 2003
Ort: Bamberg
519 Beiträge
 
#7

Re: pchar freigeben?

  Alt 15. Feb 2006, 13:40
Zitat von ste_ett:
GetMem/FreeMem oder besser New/Dispose wird nur benötigt, wenn du z.B. PChars an Funktionen übergibst und diese den "Inhalt" des PChars verändern.
hä? warum das?
  Mit Zitat antworten Zitat
Sebastian R.

Registriert seit: 12. Feb 2006
94 Beiträge
 
#8

Re: pchar freigeben?

  Alt 15. Feb 2006, 13:44
Weil dann ein neues Pchar erzeugt wird.
Sebastian R.
Keep on programming!


CyCode.net - Meine Programme, Tutorials und Quelltexte
  Mit Zitat antworten Zitat
tommie-lie
(Gast)

n/a Beiträge
 
#9

Re: pchar freigeben?

  Alt 15. Feb 2006, 15:02
Ich fürchte hier herrscht Verwirrung über die Bedeutung von "PChar" und "C-String".
Eine Variable vom Typ PChar, vollkommen egal ob lokal oder global, muss nicht freigegeben werden. Ist die lokal, wird sie auf dem Stack abgelegt und beim Unrolling auch wieder davon entfernt, genauso wie alle lokalen Variablen. Globale Variablen haben ihren Speicherplatz im Image des Codes, sie existieren ohnehin über die gesamte Programmlaufzeit hinweg. In der Tat ist es gar nicht möglich, eine Variable wieder freizugeben. Habe ich eine Schleifenvariable i vom Typ Integer, die ich nach der Ausführung der Schleife nicht wieder benötige, ist es (praktisch) unmöglich, diese Variable i wieder aus dem Stack zu entfernen und den von ihr belegten Speicher wieder für andere Variablen zu benutzen. Bei einer Variable vom Typ PChar ist das nicht anders, ich kann den Speicherplatz (heute noch 4 Byte) nicht wieder freigeben.
Die 4 Byte hinter dem PChar können allerdings als Pointer interpretiert werden, der auf einen bestimmten Speicherbereich zeigt. Das wird in der Regel ein Block auf dem Heap sein. Diesen Block muss ich explizit reservieren (GetMem(), New(), HeapAlloc(), GlobalAlloc(), Konstruktor einer Klasse) und muss ihn daher genauso explizit wieder freigeben (FreeMem(), Dispose(), HeapFree(), GlobalFree(), Destruktor einer Klasse). Wenn ich also zunächst Speicher für meine PChar-Variable reserviere und anschließend einen String reinschreibe, muss ich den Speicher anschließend auch wieder freigeben, genauso wie ich ein Objekt durch einen Aufruf seines Destruktors zerstören muss (zumindest in Delphi).
Die Variable lediglich auf den Wert nil zu setzen ist sinnlos. Wenn ich den Speicher noch nicht freigegeben habe, verliere ich damit die Referenz auf den Speicher (der somit allokiert bleibt). Wenn ich den Speicher bereits freigegeben habe, benötige ich eine Zuweisung auf nil nicht mehr.
Da man PChars in der Regel auch zum Referenzieren von Speicherblöcken benutzt und nicht, weil sie bei den Variablen-Definitionen schick aussehen, muss man diese Speicherblöcke auch wieder freigeben.

Die Aussage von mkinzler:
Zitat von mkinzler:
Da PChar nur eine Zeigertyp ist (Zeiger auf einen Char) ist ein Freemem eigentlich nicht nötig.
Ist in beiden möglichen Interpretationsfällen falsch:
Ein FreeMem() ist auf die Variable vom Typ PChar nicht anwendbar, es ist also nicht nicht nötig, sondern es ist gar nicht erst möglich.
Ein FreeMem() auf den Speicherbereich, den die Variable vom Typ PChar referenziert (FreeMem(blubb), wenn blubb vom Typ PChar ist), ist auf jeden Fall nötig, sofern diese Variable einen Speicherbereich allokiert, der zuvor angefordert wurde (also dann, wenn man tatsächlich etwas mit seiner Variable macht).
Besonders interessant wird es dann, wenn man eine Variable vom Typ PChar hat, die auf das erste Zeichen eines Pascal-Strings zeigt:
Delphi-Quellcode:
procedure DoSomething;
var
  s: String;
  c: PChar;
begin
  s := 'Hello, world';
  c := @s[1];
end;
Hier vermischt man Compiler-Magic (Pascal-Strings) mit gewöhnlichem handmade Code. Es wird (dynamisch auf dem Heap) Speicher für den Pascal-String "Hello, world" reserviert. Gleichzeitig zeigt aber c auf das erste Zeichen. Beim verlassen der Funktion wird nun automagisch der Speicher des Strings freigegeben und somit auch der Speicherbereich, auf den c zeigt. Ein zusätzlichen Freigeben von c wäre hier unangebracht und würde zu einem Fehler führen, wenn der Compiler den Speicher für den String ein zweites Mal freigeben möchte (EInvalidPointer dürfte die Exception sein).


HTH
  Mit Zitat antworten Zitat
mumu

Registriert seit: 28. Okt 2003
Ort: Bamberg
519 Beiträge
 
#10

Re: pchar freigeben?

  Alt 16. Feb 2006, 07:58
vielen vielen dank für die ausführliche antwort !!!!

aber eine frage hätte ich noch:
Delphi-Quellcode:
p_char: PChar;
begin
...
  p_char := nil;
  FreeMem(p_char);
end;
macht sowas sinn? wenn ich doch den p_char auf nil setz, dann kann ich doch den speichernbereich mit FreeMem nicht mehr freigeben, weil ich ja net weiß, wohin der p_char zeigt, oder?

// edit:
ahh hier steht ja die antwort, sorry
Zitat:
Die Variable lediglich auf den Wert nil zu setzen ist sinnlos. Wenn ich den Speicher noch nicht freigegeben habe, verliere ich damit die Referenz auf den Speicher (der somit allokiert bleibt). Wenn ich den Speicher bereits freigegeben habe, benötige ich eine Zuweisung auf nil nicht mehr.
Da man PChars in der Regel auch zum Referenzieren von Speicherblöcken benutzt und nicht, weil sie bei den Variablen-Definitionen schick aussehen, muss man diese Speicherblöcke auch wieder freigeben.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 12:30 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