Hello
When i working on my interpreter i found mem leak
when i looking into Windows Task manager
when program start i have somewhere cca 1368 kb used
most programs in interpreter don't make leaks including drawing all
possible fractals and graphics ..then there is no increase in memory usage
BUT
when i use WM_KEYDOWN message processing then mem leak become visible.
like i do:
CASE WM_KEYDOWN
hWParam = wParam
'call block winMsg
if pos_wmKeyDown > 0
'print "KEYDOWN:" + str(pos_wmKeyDown)
tc = pos_wmKeyDown : tokInterpreter()
tc = 0
end if
I suspect that is because i called same interpreter function multiple times
when keyboard key is pressed.
I don't tested is this also happened when i do ordinary clicking on GUI button
but i will
memory goes up to 6240 kB (if i remember) then program just exit
simply is closed like when we use ExitProcess 0
Is there a way to prevent this memory consumption?
thanks
You can get into a situation where a procedure calls itself indirectly, and never returns. A quick test for recursion is to look at the stack pointer at one position in the program, and see whether it goes down continuously.
sys pp=esp 'read the stack pointer
...
Stacks are usually around 1 meg and quickly overflow when recursion is uncontrolled. Whereas string memory leaks run into hundreds or even thousands of meg before crashing the system.
OK
but where to put this check?
sys pp=esp 'read the stack pointer
Not sure if this apply to your case Aurel, in any case...
To avoid Windows message auto recursion, I often use a flag like this...
CASE WM_KEYDOWN
static boolean OnceOnlyFlag
hWParam = wParam
'call block winMsg
if pos_wmKeyDown > 0
if OnceOnlyFlag = false
OnceOnlyFlag = true
'print "KEYDOWN:" + str(pos_wmKeyDown)
tc = pos_wmKeyDown : tokInterpreter()
tc = 0
OnceOnlyFlag = false
end if
end if
Hi Pierre
Yes it looks that is auto recursion
and i will try your method
Unfortunately this method block function call
so execute just once and stop.
So, if I follow corectly, it never come back from tokInterpreter() ?
If you put a MBOX("Back from tokInterpreter!") after tokInterpreter(), it will never pop up ?
About Charles great suggestion, (maybe he forgot about your question)
You may put it where you think the leak occur...
sys pp=esp 'read the stack pointer to check for abnormal growing size
SetWindowText(hDlg, "stack pointer " & hex(pp))
QuoteSo, if I follow corectly, it never come back from tokInterpreter() ?
If you put a MBOX("Back from tokInterpreter!") after tokInterpreter(), it will never pop up ?
Hi Pierre
I must test it ..last time i tested it return
because when i press key key respond.
I really must made demo program in interpreter to test it .
As i said before ..leak occurs only when i use WM_KEYDOWN
which call tokInterpreter() function each time key was pressed
the problem is ..i guess is -> i called already running function
ok i will post some code
Hi to all
Yes ...main problem was in multiple function calls
when already interpreter function is called
and i remove that part from WM_KEYDOWN message and now is:
CASE WM_KEYDOWN
hWParam = wParam
'call block winMsg
if pos_wmKeyDown > 0
'print "KEYDOWN:" + str(pos_wmKeyDown)
tc = pos_wmKeyDown : hWParam = 0
tc = 0
end if
then i get that work without leaks
that part is fine now (i hope)
then i have problem with hWparam variable which read wparam
also i figured that i must reset it to null after is executed
because as it is global ,hold old value and must be reseted to null.