Speicherlecks finden (evtl. hilfreich)
Verfasst: 25.03.2008 14:11
Hab mir hier eine Kleinigkeit gebastelt um Speicherlecks zu finden. Da die
OnError-Lib ja leider unter Linux nicht funktioniert, ist es etwas einfacher
geworden.
Es wird eine globale Variable 'MemAlloc.l' definiert, die die Anzahl der
allokierten Bytes beinhaltet. Die Funktionen 'AllocateMemory()',
'ReAllocateMemory()' und 'FreeMemory()' werden durch Procedures
ersetzt und erhalten einen zusätzlichen optionalen Parameter. Dieser kann
entweder weggelassen werden um die Bytes zu zählen oder es kann mit
ihm 'nocount' übergeben werden, wodurch die Bytes nicht gezählt werden.
Wichtig ist, dass ein mit 'AllocateMemory(?)' allokierter Speicher weiterhin
nur mit den Funktionen ohne optionalen Parameter verwendet werden
darf. Umgekehrt gilt das selbe.
Ein Beispiel dazu gibt es nicht. Die Anwendung sollte klar sein.
OnError-Lib ja leider unter Linux nicht funktioniert, ist es etwas einfacher
geworden.
Code: Alles auswählen
Global MemAlloc.l
Procedure AMcount(Size.l)
Protected *mem
If Size <= 0 : ProcedureReturn 0 : EndIf
*mem = AllocateMemory(size + 4)
If *mem
PokeL(*mem, size)
MemAlloc + Size
ProcedureReturn *mem + 4
EndIf
ProcedureReturn 0
EndProcedure
Procedure RAMcount(*mem, Size.l)
Protected oldSize.l, *nmem
If Size <= 0 : ProcedureReturn 0 : EndIf
oldSize = PeekL(*mem - 4)
*nmem = ReAllocateMemory(*mem - 4, Size + 4)
If *nmem
MemAlloc - oldSize + Size
PokeL(*nmem, Size)
ProcedureReturn *nmem + 4
EndIf
ProcedureReturn 0
EndProcedure
Procedure FMcount(*mem)
MemAlloc - PeekL(*mem - 4)
ProcedureReturn FreeMemory(*mem - 4)
EndProcedure
Procedure AMnocount(Size.l)
ProcedureReturn AllocateMemory(size)
EndProcedure
Procedure RAMnocount(*mem, Size.l)
ProcedureReturn ReAllocateMemory(*mem, Size)
EndProcedure
Procedure FMnocount(*mem)
ProcedureReturn FreeMemory(*mem)
EndProcedure
Macro AllocateMemory(Size, mode=count)
AM#mode(Size)
EndMacro
Macro ReAllocateMemory(mem, Size, mode=count)
RAM#mode(mem, Size)
EndMacro
Macro FreeMemory(mem, mode=count)
FM#mode(mem)
EndMacro
allokierten Bytes beinhaltet. Die Funktionen 'AllocateMemory()',
'ReAllocateMemory()' und 'FreeMemory()' werden durch Procedures
ersetzt und erhalten einen zusätzlichen optionalen Parameter. Dieser kann
entweder weggelassen werden um die Bytes zu zählen oder es kann mit
ihm 'nocount' übergeben werden, wodurch die Bytes nicht gezählt werden.
Wichtig ist, dass ein mit 'AllocateMemory(?)' allokierter Speicher weiterhin
nur mit den Funktionen ohne optionalen Parameter verwendet werden
darf. Umgekehrt gilt das selbe.
Ein Beispiel dazu gibt es nicht. Die Anwendung sollte klar sein.