Speicher wird nicht freigegeben

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benubi
Beiträge: 186
Registriert: 22.10.2004 17:51
Wohnort: Berlin, Wedding

Re: Speicher wird nicht freigegeben

Beitrag von Benubi »

Das Problem ist scheinbar gelöst,
vielen Dank für die Hilfe!


Es war doch die Speicher-Allocation Funktion; diese hatte ich ein wenig verschlimbessert zwischendurch. Ich habe ein paar Wrapper und Statistik-Prozeduren hinzufefügt, und Müll beiseite geschafft - bis ich den Fehler weggeputzt hatte. Letztendlich lag es vor Allem am Zusammenspiel mit ReAllocateMemory. Mir war eingefallen, daß Lua niemals 1 byte anfordern wird (mein Windows erlaubt nur minimal 2 Bytes zu alloziieren),doch wohl eher 0 oder 2, wegen des c structure paddings (denke ich jedenfalls), und daher lange Rede kurzer Sinn... Jetzt sieht sie so aus:

Code: Alles auswählen

  ProcedureC.i __allocHandler(*ud, *ptr, osize, nsize)
    Protected res
    
    If nsize = 0 And *ptr ; free memory
         FreeMemory(*ptr);
         res = #Null 
         _MRemove(osize,#True) ; statistik
         
     ElseIf nsize<=0 ; do nothing
         res = #Null
       
     Else   ; malloc /realloc
                  
         If *ptr=#Null 
           res = AllocateMemory(nsize) ; malloc
           _MAdd(nsize,#True) ; statistik
           
          Else  ; realloc:  
            ; 
            If osize=nsize ; no change
              res=*ptr
              
            Else 
              res=ReAllocateMemory(*ptr, nsize)
              If nsize>osize
                _MAdd(nsize-osize,#False) ; statistik
              Else 
                _MRemove(osize-nsize,#False) ; statistik
              EndIf 
            EndIf              
          EndIf 
          
     EndIf 
    ProcedureReturn res ; return to Lua
  EndProcedure
Prima! Dann habe ich gleich ein paar nützliche Speicher Auswertungsfunktionen hinzugefügt.

Der Speicherverbauch steigt nicht mehr, bleibt bei ca 30MB stecken, auch beim virtuellen. Wenn man minimiert fällt er wieder auf 1.5 MB Speicherauslastung, virtueller bleibt aber konstant. Danach bleibt alles ziemlich konstant und im Leerlauf, bzw. nach Anlauf absolut Stabil!

:D
Antworten