On Sat, 2013-12-14 at 15:25 +0800, Nor Jaidi Tuah wrote:
Dear all, I had a memory leak in my app that I traced to a delegate variable. Something like this: class X { delegate void Delegate (); Delegate d; public void xx () { d = () => { do_stuff ();}; } } Given the above, the following will leak memory: { new X(). xx (); } I think this is because there is an unavoidable reference cycle between d and the X object. Is this correct? If not, then it may be a vala bug.
It's correct.
I can fix the memory leak by setting d to null before the X object gets unreffed (this makes it sound like a vala bug).
Unfortunately Vala can't know that this is a safe thing to do. It would require some very advanced analysis, and would break completely in some very common situations (like if the field weren't private, or d could also be set somewhere else with a value which didn't cause a reference count) which would mean a class of *very* difficult to diagnose and understand. Instead, you might want to consider making the field unowned, and maybe using a regular method instead of a closure just to be sure. -Evan
Attachment:
signature.asc
Description: This is a digitally signed message part