Seite 1 von 1

Speicherlecks finden (evtl. hilfreich)

Verfasst: 25.03.2008 14:11
von NicTheQuick
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.

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
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.

Verfasst: 25.03.2008 14:19
von #NULL
hab auch mal sowas gepostet, allerdings ohne 'nocount' möglichkeit: http://www.purebasic.fr/german/viewtopi ... highlight=
könnte man auch noch erweitern, so dass nur erfolgreiche allocs die variable inkrementieren und der rückgabewert von allocatememory() weitergereicht wird.

Verfasst: 25.03.2008 14:36
von NicTheQuick
Tatsächlich. Hab den Thread damals sogar schon gelesen.

Bei mir funktioniert das alles, was bei dir eben noch fehlt. Und da ich
festgestellt habe, dass 'MemorySize()' nicht immer zuverlässig funktioniert,
habe ich es eben in die ersten 4 Bytes gepackt. Als ich eben meine Hashtable
debuggt hatte, habe ich alles gebraucht, was da oben im ersten Post steht.