Re: memory leak, destroying widgets
"Jacques Le Normand" <[email protected]>
| Newsgroups | gmane.comp.lang.ocaml.lib.gtk |
|---|---|
| Message-ID | <[email protected]> |
I calculated the amount of memory leaked it's about 10 megs every 45 seconds (12 megs a minute!) On Sun, Oct 26, 2008 at 10:45 PM, Jacques Le Normand <[email protected]>wrote: > The same thing happens (the number keeps going up) > here's the diff > > ... > container_clear vbox; > Gc.full_major (); > print_endline (string_of_float (Gc.allocated_bytes ())); > ... > > P.-S. sorry Jacques if you receive this message twice, I forgot to cc the > list the first time > --Jacques > > > On Sun, Oct 26, 2008 at 10:40 PM, Jacques Le Normand <[email protected] > > wrote: > >> I get the same result (the number keeps going up) >> here's the diff >> >> ... >> container_clear vbox; >> Gc.full_major (); >> print_endline (string_of_float (Gc.allocated_bytes ())); >> ... >> >> >> >> On Sun, Oct 26, 2008 at 10:28 PM, Jacques Garrigue < >> [email protected]> wrote: >> >>> From: "Jacques Le Normand" <[email protected]> >>> >>> > I'm getting a memory leak in my program because, when I destroy a >>> widget, >>> > the memory does not get freed. I thought it would be done automatically >>> when >>> > I call #remove from the container, but this does not seem to be the >>> case. >>> > How can I destroy my widgets and make sure the memory is cleared? I've >>> tried >>> > 2 or 3 different ways, with the same result. >>> >>> You should use Gc.full_major, to ensure that all finalizers are >>> called. >>> Note however that, in byte code, a variable referenced in the >>> environment (either function argument or let-definition) cannot be >>> freed until you leave the function. >>> It should be ok to add a Gc.full_major call in your timeout. >>> >>> Jacques >>> >>> >>> > Here is a program that creates and destroys 100 GEdit.entry every >>> 200ms. At >>> > every iteration, I call Gc.allocated_bytes . The number printed keeps >>> going >>> > up (showing that there is a memory leak.) I posted it a week ago. I've >>> > gotten a couple of people to run it and they all get the same result. >>> If >>> > more people could run it to make sure, that would be greatly >>> approciated. >>> > cheers >>> > --Jacques >>> > >>> > >>> > let repeat n f = >>> > let rec rep i = >>> > if i = n then [] else (f () :: rep (i+1)) >>> > in >>> > rep 0 >>> > >>> > >>> > let container_clear c = >>> > List.iter c#remove c#all_children >>> > >>> > let _ = >>> > let source_window = GWindow.window ~width:100 ~height:100 () in >>> > let vbox = GPack.vbox ~packing:source_window#add () in >>> > let inside = ref false in >>> > let fill_vbox () = >>> > if !inside then >>> > () >>> > else >>> > begin >>> > inside := true; >>> > let add_entry () = >>> > let ret = GEdit.entry () >>> > in >>> > vbox#pack (ret:>GObj.widget); >>> > ret >>> > in >>> > container_clear vbox; >>> > print_endline (string_of_float (Gc.allocated_bytes ())); >>> > ignore(repeat 100 add_entry); >>> > inside:=false >>> > end >>> > in >>> > ignore(Glib.Timeout.add 200 (fun () -> fill_vbox (); true)); >>> > source_window#show (); >>> > GMain.Main.main () >>> >> >> > _______________________________________________ Lablgtk mailing list [email protected] http://yquem.inria.fr/cgi-bin/mailman/listinfo/lablgtk