AllocateMemory - Interessantes Hintergrundwissen
Verfasst: 04.12.2009 04:00
Tachchen,
ich hatte mal wieder n Bug in meinem Programm, als ich ihn gefunden habe, und ein paar tests gemacht habe. Sind mir folgende Dinge aufgefallen:
Wenn ich ein Speicher erstelle bleiben hinter oder vor dem Speicher immer 8 bis 16 Bytes frei
Es wird dabei immer auf ganze Quads erweitert.
Die Frage nun was steht in den 8 Bytes die "so zu sagen" unnötig frei bleiben,
Keine Ahnung
Wenn man aber zB noch ein stück weiter geht so passiert folgendes:
Hier schreibe ich genau an die Stelle etwas an der das nächste AllocateMemory seinen Pointer hätte!
16+8 = 24
Nun komm ein Fehler beim nachfolgedem AllocateMemory : Lesefehler an der Adresse 1000
also immer genau 4 mehr als meine Variable Irgendwas
Und nun stell ich fest das immer hinter dem aktuellen AllocateMemory mit Freiraum die selbe Zahl steht:
Mir stellt sich jetzt die Frage wieso ?
Eine art Header für alle erstellten Memorys ?
Gibs dort Vielleicht auch n Liste die alle MemoryPointer enthält ?
Wenn ja, könnte man damit seine Speicher (ohne (eigene) LinkedList) überwachen ...
Ich bin noch nicht weiter zum Nachforschen gekommen ...
Vielleicht weiß einer mehr darüber ...
zumindest weiß ich das an dieser Pointer, der Wert für den nächsten kommenden AllocateMemory steht, deswegen sollte man den nicht löschen oder überschreiben, da es sonst zu einem fehler kommt den man bis nicht erklären kann... wie oben gezeigt ... das AllocateMemory() versagt ...
ich hatte mal wieder n Bug in meinem Programm, als ich ihn gefunden habe, und ein paar tests gemacht habe. Sind mir folgende Dinge aufgefallen:
Wenn ich ein Speicher erstelle bleiben hinter oder vor dem Speicher immer 8 bis 16 Bytes frei
Es wird dabei immer auf ganze Quads erweitert.
Code: Alles auswählen
Structure Test
Pos.l[0]
EndStructure
For n = 1 To 20
*Pointer.Test = AllocateMemory(n)
If *OldPointer
Debug "'Freiraum' : "+Str(*Pointer-*OldPointer-MemorySize(*OldPointer))
EndIf
Debug "Pointer: "+Str(*Pointer)+" - Länge "+Str(n)
*OldPointer = *Pointer
Next
Keine Ahnung
Wenn man aber zB noch ein stück weiter geht so passiert folgendes:
Hier schreibe ich genau an die Stelle etwas an der das nächste AllocateMemory seinen Pointer hätte!
16+8 = 24
Code: Alles auswählen
*Pointer = AllocateMemory(16)
Debug MemorySize(*Pointer)
Irgendwas = 996
PokeL(*Pointer+24, Irgendwas)
*Pointer2 = AllocateMemory(16)
Debug MemorySize(*Pointer2)
also immer genau 4 mehr als meine Variable Irgendwas
Und nun stell ich fest das immer hinter dem aktuellen AllocateMemory mit Freiraum die selbe Zahl steht:
Code: Alles auswählen
Structure Test
Pos.l[0]
EndStructure
For n = 1 To 20
*Pointer.Test = AllocateMemory(n)
If *OldPointer
Freiraum = *Pointer-*OldPointer-MemorySize(*OldPointer)
Debug "'Freiraum' : "+Str(Freiraum)
EndIf
Debug "Pointer: "+Str(*Pointer)+" - Länge "+Str(n)
*OldPointer = *Pointer
If Not Freiraum%8
Debug " Dahinter: "+Str(PeekL(*Pointer+Freiraum+n-1+8))
Else
Debug " Dahinter: "+Str(PeekL(*Pointer+Freiraum+n-1))
EndIf
NextEine art Header für alle erstellten Memorys ?
Gibs dort Vielleicht auch n Liste die alle MemoryPointer enthält ?
Wenn ja, könnte man damit seine Speicher (ohne (eigene) LinkedList) überwachen ...
Ich bin noch nicht weiter zum Nachforschen gekommen ...
Vielleicht weiß einer mehr darüber ...
zumindest weiß ich das an dieser Pointer, der Wert für den nächsten kommenden AllocateMemory steht, deswegen sollte man den nicht löschen oder überschreiben, da es sonst zu einem fehler kommt den man bis nicht erklären kann... wie oben gezeigt ... das AllocateMemory() versagt ...