Hello Emmanuele,

I reran my code, looked a bit at the archives (especially your answer
to a question about a potential memory leak of gtk_widget_destroy() 
https://mail.gnome.org/archives/gtk-list/2008-September/msg00108.html)
and here's where I am now:
- not only the test program for the dialog increases in memory usage
over time but also the one for the window. I assume this is because
they're both toplevel.
- since I don't think that my code is faulty, is it correct to assume
that the GSlice allocator simply doesn't really release the memory I
requested until the end of program runtime?

-Jonas

On Wed, 2016-08-03 at 12:44 +0100, Emmanuele Bassi wrote:
> Hi;
> 
> you should probably search the archives of this very mailing list, as
> this question has been asked countless times.
> 
> The tl;dr is:
> 
>  * GObject uses a slab allocator, not the system one
>  * top is not a memory profiling tool
>  * if you keep things running in a tight loop you don't give GTK any
> chance to actually release memory
>  * gtk_widget_destroy() is not the equivalent of free()
> 
> Ciao,
>  Emmanuele.
> 
> 
> On 3 August 2016 at 12:24, Jonas <legojo...@gmx.de> wrote:
> > Hello everyone,
> > 
> > I have a question about a memory leak I seem to have with
> > GtkDialog. I
> > already posted this on DreaminCode (username Progammer) and decided
> > to
> > ask the same question on the mailing lists here. Here it is:
> > 
> > "[...]I looked at the Gtk and GObject Documentation and figured out
> > the
> > following from Gtk Common Question 1.5, GObject Manual and the
> > gtk_widget_destroy() documentation:
> > 
> > - GtkWidgets that are top-level windows are created with an initial
> > floating reference count of one, Gtk calls g_object_ref_sink() to
> > acquire the reference and keeps the window in its list of top
> > -levels.
> > - all other GtkWidgets (e.g. buttons) are created with a floating
> > reference count of one. Packing the widget into a container makes
> > the
> > container own the reference (the container calls g_object_ref_sink
> > on
> > the widget). Simply calling g_object_ref_sink on your own makes
> > your
> > own code acquire the initial reference.
> > - destroying widgets: gtk_widget_destroy breaks references the
> > widget
> > holds to other widgets, packed widgets are removed from their
> > containers (decrementing the widget's reference count) and top
> > -level
> > windows are removed from Gtks list of top-levels (also decrementing
> > the
> > reference count).
> > - when the reference count of an object drops to 0, the object is
> > finalized and it's memory is freed
> > - GtkWindow is a GtkWidget is a GInitiallyUnowned is a GObject
> > (shortened hierarchy)
> > 
> > I wrote the following three programs to demonstrate memory
> > management
> > of GtkButton, GtkWindow and GtkDialog:
> > -- as far as I see it, GtkDialog is derived from GtkWindow and is
> > therefore a top-level and kept in Gtks list of top-levels. Please
> > correct me if I'm wrong ;) --
> > 
> > GtkButton:
> > 
> > #include <gtk/gtk.h>
> > 
> > int main (int argc, char *argv[])
> > {
> >     gtk_init( &argc, &argv );
> > 
> >     GtkWidget *button;
> >     do
> >     {
> >         button = gtk_button_new();  //create with floating ref
> > count of
> > one
> >         g_object_ref_sink(button);  //acquire the initial floating
> > reference (ref count is now 0 and non-floating)
> >         gtk_widget_destroy(button); //break external references
> >         g_object_unref(button);     //release my reference
> > (reference
> > count drops to 0, the widget's memory is freed)
> >         printf("Destroyed\n");
> >     }
> >     while(getchar() != 'Q');
> > 
> >     return 0;
> > }
> > 
> > 
> > GtkWindow:
> > 
> > #include <gtk/gtk.h>
> > 
> > int main (int argc, char *argv[])
> > {
> >     gtk_init( &argc, &argv );
> > 
> >     GtkWidget *window;
> >     do
> >     {
> >         window = gtk_window_new(GTK_WINDOW_TOPLEVEL);  //create
> > window,
> > gtk will add it to it's list of top-levels and acquire ownership of
> > the
> > initial reference.
> >         gtk_widget_destroy(window);   //break references the window
> > holds to other objects, remove window from gtk's list of toplevels.
> > Window is finalized (memory is freed).
> >         printf("Destroyed\n");
> >     }
> >     while(getchar() != 'Q');
> > 
> >     return 0;
> > }
> > 
> > GtkDialog:
> > 
> > #include <gtk/gtk.h>
> > 
> > int main (int argc, char *argv[])
> > {
> >     gtk_init( &argc, &argv );
> > 
> >     GtkWidget *dialog;
> >     do
> >     {
> >         dialog = gtk_dialog_new();     //create dialog, add to list
> > of
> > top-levels
> >         gtk_widget_destroy(dialog);    //break references it holds,
> > remove from list of top-levels, finalizing dialog and freeing
> > memory (I
> > thought :D)
> >         printf("Destroyed\n");
> >     }
> >     while(getchar() != 'Q');
> > 
> >     return 0;
> > }
> > 
> > 
> > For all three programs, a widget is created and destroyed and when
> > the
> > user hits the Return key and 'Q' was not pressed right before, it's
> > done again.
> > 
> > What I expected to happen:
> > - Memory usage of all three programs should stay the same even when
> > I
> > hit the Return key a hundred to a thousand times or more.
> > 
> > What really happened:
> > - the memory usage did not go up for the program with the GtkButton
> > and
> > the program with the GtkWindow.
> > - for the program with the GtkDialog, the memory usage went up
> > every
> > time I hit the return key.
> > 
> > Why is this happening? I thought GtkDialog would behave the same as
> > GtkWindow in terms of memory management since it's derived from it.
> > 
> > I hope anyone knows what is going on here :)" - Progammer on 
> > http://www
> > .dreamincode.net/forums/topic/395882-trouble-with-gtkdialog-memory
> > -management/ (August 3rd 2016, 11:23 GMT)
> > 
> > 
> > Does anyone of you know why this is?
> > 
> > Jonas Fuglsang-Petersen
> > _______________________________________________
> > gtk-app-devel-list mailing list
> > gtk-app-devel-list@gnome.org
> > https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list
> 
> 
> 
_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Reply via email to