mem leak blues

BlitzMax Forums/BlitzMax Programming/mem leak blues

Chris C(Posted 2005) [#1]
I have an array of types which has a type in one of its fields

when I delete an array item i'm doing this
maxob:-1
For Local i:Int=c_ob To maxob
obs[i]=obs[i+1]
Next
obs[maxob+1].msm=Null
obs[maxob+1]=Null
obs=obs[..maxob+1]


any ideas where I might be going wrong?


Cajun17(Posted 2005) [#2]
With the way the garbage collector works you should be able to delete the instance by simply doing obs = obs[..maxob + 1] .

In fact you can do everything that whole piece of code does like this.

maxob:-1
obs = obs[1.. ]



Chris C(Posted 2005) [#3]
ignore the for loop that was so I could remove somthing mid
array

you'd think you'd be right, but it's leaking like a sieve!


Diablo(Posted 2005) [#4]
try this Chris C
Print GCMemAlloced()

Local maxob% = 10

Local obs[] = New Int[maxob]

Print GCMemAlloced()

maxob:-1
obs = obs[1.. ]

GCCollect()

Print GCMemAlloced()


EDIT: heres the results I get:
13664
13750
13170 <-- Crazzy!


EDIT 2: Better example :P
Print "Mem = " + GCMemAlloced()

Local maxob% = 10

Local obs[] = New Int[maxob]

For i = 0 To maxob - 1
	obs[i] = i
Next

Print "Mem = " + GCMemAlloced()

Print "Last object value = " + obs[maxob - 1]
Print "First object value = " + obs[0]
maxob:-1
obs = obs[1..]
Print "Last object value = " + obs[maxob - 1]
Print "First object value = " + obs[0]

GCCollect()

Print "Mem = " + GCMemAlloced()



Chris C(Posted 2005) [#5]
doesnt make any difference if I [1..] or [..x+1]

still leaking like crazy

obs contains another type that holds a milkshape model type
that has a texture and bunch of vert's

I even tried assigning all its arrays as =null but its still leaking and the memory in the task manager *never* goes down...

Print "Mem = " + GCMemAlloced()

Local maxob% = 1000

Local obs[] = New Int[maxob]

For i = 0 To maxob - 1
	obs[i] = i
Next

Print "Mem = " + GCMemAlloced()

Input$ 

For x=0 To 999

maxob:-1
obs = obs[1..]

Next

GCCollect()

Print "Mem = " + GCMemAlloced()

Input$


although gcmemalloced goes down in taskmanager the memory used doesnt go down


FlameDuck(Posted 2005) [#6]
Because BlitzMAX uses memorypools to manage memory. Allocating and deallocating memory is an expensive operation, reusing it is not.

You cannot prove a memory leak in 7 lines of staic code (unless you're doing your own memory management). You have to have real code running for several hours, and notice a significant change in memory footprint. If you have a real memoryleak, the OS will start swapping memory around like crazy.


Chris C(Posted 2005) [#7]
found it there where int used instead of tbank
for 2 createbanks...

gcalloced goes back down to the same value when
items are deleted, but mem used in the task manager only ever goes up (Every time I create an object)

it sometimes goes down but seems to be behaving okay
as if i create 100 objects then delete them then create
10 more it doesnt go any higher...

So I guess max is keeping hold of allocated memory in case
it needs it for somthing else?