Thema: Delphi pchar freigeben?

Einzelnen Beitrag anzeigen

tommie-lie
(Gast)

n/a Beiträge
 
#17

Re: pchar freigeben?

  Alt 16. Feb 2006, 11:33
Zitat von Muetze1:
Ich weiss nicht wie du bei den "..." Bereich im Code den PChar belegst, aber von dem reinen hier zu sehenden Code bekommst du dadurch höchstwahrscheinlich AV's, da der PChar zufällige Werte enthält (da lokale Variable).
Wie ich oben schon schrob ist eigentlich davon auszuegehen, daß PChar-Variablen auch verwendet werden und nicht nur existieren, weil sie schön aussehen. Es gibt Ausnahmen (eine davon war oben von mir benanntes Pascal-String-Beispiel), aber in der Regel sollte man schon ein FreeMem() oder Dispose() auf den PChar durchführen.
Kurzum, um folgende Frage zu beantworten:
Zitat von mumu:
woher will der wissen, welche bereiche freigegeben werden müssen, wenn er ja nur nil übergeben bekommt?
Kann er nicht, und genau das ist das Problem. Wenn FreeMem() einen Zeiger auf nil übergeben bekommt, passiert exakt "gar nichts". Wenn du einen gültigen Pointer auf nil setzt, weißt du anschließend nicht mehr, wo genau im Speicher der dazugehörige Speicherblock zeigt, du hast ja soeben deinen einzigen Zeiger auf diesen Block mit nil gefüllt. FreeMem() kann auch nicht hellsehen, es kann diesen "verwaisten" Speicherbereich auch nicht mehr finden und freigeben. Somit bleibt der Speicherbereich allokiert bis zum StNimmerleinstag, oder bis das Programm beendet wird und Windows den gesamten Adressbereich des Prozesses freigibt.

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 von mumu:
weil ich schnall irgendwie net, warum mein vorgänger, dass bei jedem p_char gemacht hat?!
Vielleicht Unwissen - wohl der Grund, warum er jetzt nur Vorgänger ist
Es ist in dieser Reihenfolge jedenfalls falsch und unsinnig.
  Mit Zitat antworten Zitat