![]() |
Re: pchar freigeben?
Zitat:
folgendes in der reihenfolge kann eigentlich nie sinn machen, oder? p_char := nil; FreeMem(p_char); weil ich schnall irgendwie net, warum mein vorgänger, dass bei jedem p_char gemacht hat?! Ich würd auf sowas eigentlich schon gar nicht kommen?! |
Re: pchar freigeben?
Dein Code wird eine AV auslösen, weil, wie Thomas erklärt hat, mit nil die Referenz gelöscht wird, aber das wird sie sowieso nach verlassen der lokalen Routine. Allein das FreeMem ist wichtig, wenn du Speicher mit GetMem reervierst, um den Speicher wieder frezugeben und aufzuräumen.
|
Re: pchar freigeben?
hi luckie,
nee eben nicht, da werden keine av's ausgelöst. das ist ja eben das komische?! und der verwendet des wirklich überall im code??? |
Re: pchar freigeben?
Ja, weil FreeMem() intelligent ist und einen NULL/NIL Parameter handeln kann - sprich: ihn ignoriert. Das geht gehört mit dem Funktionssyntax AllocMem() ReAllocMem(), wobei letztere auch Speicher freigeben und den Zeiger bei einer Grösse von 0 auf Nil setzen. Trotzdem kann bei Verwendung eines solchen Codes immer FreeMem() am Ende aufgerufen werden, damit bei eventuell nicht auf eine Grösse von 0 reduzierte Bereiche freigegeben werden.
|
Re: pchar freigeben?
Zitat:
wenn ich aber jetzt alles von
Delphi-Quellcode:
in
p_char: PChar;
begin ... p_char := nil; FreeMem(p_char); end;
Delphi-Quellcode:
ändere, dann sollte es eigentlich keine probleme geben, oder?
p_char: PChar;
begin ... FreeMem(p_char); end; |
Re: pchar freigeben?
Zitat:
Zitat:
|
Re: pchar freigeben?
Zitat:
Kurzum, um folgende Frage zu beantworten: Zitat:
Zu deiner nil-Geschichte: Vielleicht ist dir in einigen Quellcodes schon aufgefallen, daß Objekte nicht mit objekt.Free() freigegeben werden, sondern mit FreeAndNil(objekt). Free() setzt, ebenso wie FreeMem() den Pointer *nicht* auf nil, sondern lässt ihn auf dem alten Wert (irgendwo im Speicher) und gibt lediglich den freigegebenen Speicher frei. Da mit FreeAndNil() meine Objektreferenz nil wird, kann ich zu einem späteren Zeitpunkt feststellen, ob mein Objekt freigegeben ist bzw ob ich mit meiner Objektreferenz tatsächlich noch ein existierendes Objekt habe. Genauso kann man es mit PChars machen. Erst freigeben und nachher selber af nil setzen (und nur in dieser Reihenfolge!). Dann kannst du später mit einer if-Abfrage überprüfen ob der PChar noch gültig ist. Wenn du das in deinem gesamten Programm konsequent durchziehst, kann man pauschal die Aussage treffen: Alle PChars, die nicht nil sind, verweisen auf einen gültigen Speicherbereich. Solche Aussagen können sich irgendwann mal als praktisch erweisen. Zitat:
Es ist in dieser Reihenfolge jedenfalls falsch und unsinnig. |
Re: pchar freigeben?
Zitat:
Vielen vielen Dank Tommie-lie genau auf so eine klipp und klare antwort habe ich gehofft :-) :thumb: :thumb: :thumb: |
Re: pchar freigeben?
Zitat:
Zitat:
Man muss halt genau sein, sonst heisst es ein halbes Jahr später wieder: "Aber du hattest doch geschrieben ..." und man stellt mit Entsetzen fest, es war nicht eindeutig formuliert bzw. derjenige denkt nicht an das an was ich damals dachte... |
Re: pchar freigeben?
Wenn du den Speicher selbst mit GetMem holst, und wenn du es `ganz´ sauber machen willst, dann schreibe es so:
Delphi-Quellcode:
var
p_char: PChar; begin ... GetMem(p_char, n_char); try ... finally FreeMem(p_char); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:01 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