Einzelnen Beitrag anzeigen

cmrudolph

Registriert seit: 14. Aug 2006
29 Beiträge
 
Delphi 7 Professional
 
#3

Re: Umgang mit PChar - Speichermanagement

  Alt 26. Dez 2007, 11:49
Recht herzlichen Dank für die ausführlichen Ausführungen. Die Informationen zum PChar() Befehl hatte ich aus der Delphi Hilfe entnommen (PChar -> String Abhängigkeiten).
Zitat:
Gelegentlich muss ein langer String in einen null-terminierten String konvertiert werden, wenn Sie beispielsweise eine Funktion aufrufen, die einen PChar als Parameter benötigt. Wenn Sie einen String in einen PChar umwandeln müssen, sind Sie dafür verantwortlich, dass der resultierende PChar verfügbar bleibt. Da für lange Strings eine Referenzzählung durchgeführt wird, wird der Abhängigkeitswert des Strings um Eins erhöht, obwohl der eigentliche Referenzzähler nicht erhöht wird. Sobald der Referenzzähler den Wert Null erreicht, wird der String freigegeben, trotz der noch vorhandenen Abhängigkeit. Der umgewandelte PChar ist ebenfalls nicht mehr verfügbar, obwohl die Routine, an die er übergeben wurde, möglicherweise noch darauf zugreift.
Wie ein PChar / AnsiString / ShortString intern aussieht war mir bereits bekannt. Die Differenzierung zwischen Stack und Heap sowie deren Verwendung brachte jedoch Klarheit. Dieses ständige "dem User durch Automatisierung helfen" stört mich bei Delphi mittlerweile gewaltig. Den Ausführungen nach kommt das Problem, welches ich zur Zeit habe auch daher. Ich bekomme nämlich immer eine Access Violation wenn das Programm beendet wird und ich vorher Speicher reserviert aber auch wieder freigegeben habe. Ich denke, da versucht Delphi automatisch den reservierten Speicher freizugeben, der jedoch schon freigegeben ist. Sollte ich den Pointer nach der Freigabe ggf auf nil setzen? (Werde ich nachher mal probieren...)

Befindet sich die Result Variable auf dem Heap oder Stack?
Falls diese auf dem Stack ist, dann muss sie ja von der aufrufenden Funktion initialisiert worden sein.
(Liegt die nicht auf dem Stack direkt unter den Parametern der Funktion?)

Teilen sich DLL und Programm den gleichen Speicherbereich? Will meinen, kann die DLL den Speicher, der von dem Programm reserviert wurde einfach wieder freigeben, in ihn schreiben und lesen?

Wo finde ich weitere Informationen wann Delphi welchen Speicher automatisch reserviert und wieder freigibt? Also beispielsweise: ich habe einem AnsiString, weise einen Wert zu und Delphi kümmert sich ums Speichermanagement.

Wo werden nur die Pointer gespeichert (wie bei den Klassen) und wo wird die Variable direkt gespeichert (wie bei einem Integer)?
/* Edit:
Habe Informationen in der Delphi Hilfe gefunden, diese Frage ist beantwortet.
Für alle die es nachlesen wollen:
Delphi Sprachreferenz -> Der Speichermanager
*/

Ein Haufen Fragen, vielleicht hat ja jemand Lust ein wenig Licht ins Dunkel zu bringen.

mfG,
Christian
  Mit Zitat antworten Zitat