Hi;

On 3 August 2016 at 15:37, Jonas <legojo...@gmx.de> wrote:
> 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.

Yep.

> - 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?

The slice allocator will reuse freed slices of memory, if it can. If
you keep allocating stuff in a tight loop it may end up with a larger
slice of allocated memory before going back into the available slices
and recycle the memory.

That's why I said that top is not a memory measurement tool. If you
want to check for leaks, use Valgrind — and read these links before
doing that:

  * https://wiki.gnome.org/Valgrind
  * https://mail.gnome.org/archives/gtk-devel-list/2016-August/msg00000.html

Ciao,
 Emmanuele.

> 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
>>
>>
>>



-- 
https://www.bassi.io
[@] ebassi [@gmail.com]
_______________________________________________
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