freeing GTK+ memory



-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi

all GTK classes have a create function and instances may be created with g_object_new as well. How can I free the memory
of widget's I don't need anymore? Does gtk_widget_destroy do the work for me?

I've written a small application
#include <gtk/gtk.h>

void quit_app(GtkWidget *widget, gpointer data)
{
	gtk_main_quit();
}

void killme(GtkButton *button, gpointer data)
{
	gtk_widget_destroy(GTK_WIDGET(data));
}

int main(int argc, char **argv)
{
	gtk_init(&argc, &argv);

	GtkWindow *window = g_object_new(GTK_TYPE_WINDOW,
			"title", "Who does call g_free?",
			NULL);

	g_signal_connect(window,
			"destroy",
			G_CALLBACK(quit_app),
			NULL);

	GtkButton *button = g_object_new(GTK_TYPE_BUTTON,
			"label", "kill me", NULL);
	g_signal_connect(button, "clicked", G_CALLBACK(killme), window);
	gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(button));

	gtk_widget_show_all(GTK_WIDGET(window));
	gtk_main();
	return 0;
}


When I run it with valgrind I get
==11838== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 33 from 2)
==11838== malloc/free: in use at exit: 407,811 bytes in 6,544 blocks.
==11838== malloc/free: 42,041 allocs, 35,497 frees, 11,626,260 bytes allocated.
==11838== For counts of detected errors, rerun with: -v
==11838== searching for pointers to 6,544 not-freed blocks.
==11838== checked 585,612 bytes.
==11838==
==11838== LEAK SUMMARY:
==11838==    definitely lost: 25,376 bytes in 893 blocks.
==11838==      possibly lost: 71,496 bytes in 79 blocks.
==11838==    still reachable: 310,939 bytes in 5,572 blocks.
==11838==         suppressed: 0 bytes in 0 blocks.
==11838== Rerun with --leak-check=full to see details of leaked memory.

6500 non-freed blocks? It seems "a lot" for me. Even a small programm like

int main(int argc, char **argv) {gtk_init(&argc, &argv);return 0;} has 619 non-free blocks. Why? Is there a function to
free this memory?

Some function tell me that I need to free the memory by myself. For example, yesterday I wrote

GtkLabel *label;
PangoAttrList *attrib_list = pango_attr_list_new();

PangoAttribute *attr = pango_attr_weight_new(PANGO_WEIGHT_BOLD);
pango_attr_list_insert(attrib_list, attr);

attr = pango_attr_foreground_new(21588, 4626, 50886);
pango_attr_list_insert(attrib_list, attr);

label = g_object_new(GTK_TYPE_LABEL,
    "label", "Select the desired drink and click the button",
    "attributes", attrib_list,
     NULL);

The pange documentation points to the fact that the memory reserved by pango_attr_weight_new, pango_attr_foreground_new,
etc. should be freed by the user using pango_attribute_destroy, etc. What happens if I do
gtk_widget_detroy(GTK_WIDGET(label))? Do I have to free the memory from pango by myself?

Regards
Pablo


- --
Pablo Yánez Trujillo
http://klingsor.informatik.uni-freiburg.de/
My public key: http://klingsor.informatik.uni-freiburg.de/gpg/supertux.asc
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.9 (GNU/Linux)

iEYEARECAAYFAkj3jggACgkQDzf8xo+0xRWG9ACg3WJ9y3aX12ADo27HfqGSSL7A
AlUAnAlln2+4dosliB3wqk8UCnvaEmIb
=1Sce
-----END PGP SIGNATURE-----


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]