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