Zitat von
cmrudolph:
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...)
Eine
AV kommt in der Regel dadurch zustande, dass man generell auf ein ungültiges Datum zugreift, das kann man auf ganz unterschiedliche Arten erreichen. Hier gibt es auch die Möglichkeit, dass Delphi etwas frei geben möchte, was bereits durch den Nutzer frei gegeben wurde (bzw. umgekehrt). Sehr viel häufiger kommt es aber vor, dass der Benutzer etwas freigeben oder benutzen möchte, was er selbst schon frei gegeben hat.
Es kommt hier also ein wenig darauf an, wie Du den Speicher reservierst und/oder wieder frei gibst.
Zitat von
cmrudolph:
Befindet sich die Result Variable auf dem Heap oder Stack?
Auch das kann man so nicht richtig beantworten. Hat ein wenig was mit der Aufrufkonvention zu tun (schau mal nach register, pascal, ccall, stdcall, ...). Das sollten erstmal die sein, die Delphi verwendet, aber andere Sprachen kennen auch noch jvm oder so. Jedenfalls kann die Aufrufkonvention auch gleich darüber entscheiden, ob eine Variable auf dem Stack abgelegt oder über ein Register übergeben wird. Wichtig ist es, dass man hier die Variable und das Referenzierte Datum unterscheidet.
Wird eine Zahl (Byte, Short, Word, ...), ein Char, ein Boolscher Wert, ein String, ein statisches Array, ein Set, ein Record oder eine Enumeration (Aufzählungstyp mit Type) übergeben, kannst Du die alle wie eine lokale Kopie betrachten (da kümmer sich dann auch Delphi um das Freigeben). Natürlich kannst Du die auch an weitere Routinen durchreichen (wird eben erneut eine Kopie erzeugt, bzw. bei einem String kommt dann auch eine Referenzzählung zum Einsatz).
Bei allem was Du dyn. selbst erzeugst (Objekt-Exemplare, dyn. Arrays oder eben direkt reservierter Speicher mit GetMem bzw. New, StrAlloc usw.) führt immer zur Speicherreservierung auf dem Heap.
Zitat von
cmrudolph:
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?
Ja, das kannst Du. Die
DLL wird dyn. in den Speicherbereich der restlichen Applikation gebunden, der Austausch von Adressen über diese Grenzen sind möglich (und nötig). Insbesondere musst Du auf diese Art und Weise sogar bei z.B. PChars den Speicher frei geben (die
DLL kann eben nicht wie bei einem String entscheiden ob dieses Datum noch referenziert wird oder nicht).