Re: checking for memory leaks in gtk
- From: jcupitt gmail com
- To: "Harinandan S" <harinandans gmail com>
- Cc: gtk-list gnome org
- Subject: Re: checking for memory leaks in gtk
- Date: Wed, 14 May 2008 17:43:12 +0100
2008/5/14 Harinandan S <harinandans gmail com>:
> When i ran it under valgrind with G_SLICE=always-malloc G_DEBUG=gc_friendly\
> valgrind --tool=memcheck --leak-check=yes ./a.out &>leak.log
>
> I got these leaks reported.
Those are harmless singleton objects (I think), they are not leaks.
> My main concern is running this on DirectFB platform. Its accumulating
> memory completely. I see no decrease in memory usage when second
> window is destroyed.
Is that valgrind output for the directfb backend? As I'm sure you
know, apps never (almost never) shrink. If you
open/close/open/close/open/close and see a steady increase in memuse
that does sound like a leak. But that's something valgrind should be
able to help you with.
Here's a version of your program that uses a timeout to pop the popup
up and down repeatedly. I tried it on windows and linux and saw no
steady increase in memuse, as least as reported by the pretty useless
task manager.
I don't have a directfb install to test it on, sadly.
John
/* compile with
* gcc try39.c `pkg-config gtk+-2.0 --cflags --libs`
*/
#include <gtk/gtk.h>
void
on_close_clicked (GtkButton * button, gpointer user_data)
{
GtkWidget *win = GTK_WIDGET (user_data);
gtk_widget_destroy (win);
}
static gboolean
on_close_timeout (gpointer user_data)
{
GtkWidget *win = GTK_WIDGET (user_data);
gtk_widget_destroy (win);
return FALSE;
}
GtkWidget *
create_window2 (GtkWidget * parent, gboolean self_close)
{
GtkWidget *win;
GtkWidget *align;
GtkWidget *but;
win = gtk_window_new (GTK_WINDOW_POPUP);
gtk_window_set_default_size (GTK_WINDOW (win), 100, 100);
gtk_window_set_transient_for (GTK_WINDOW (win), GTK_WINDOW (parent));
gtk_window_set_position (GTK_WINDOW (win), GTK_WIN_POS_CENTER_ON_PARENT);
align = gtk_alignment_new (0.5, 0.5, 0, 0);
gtk_container_add (GTK_CONTAINER (win), align);
gtk_widget_show (align);
but = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
gtk_container_add (GTK_CONTAINER (align), but);
if (self_close)
g_timeout_add (50, (GSourceFunc) on_close_timeout, win);
else
g_signal_connect (but, "clicked", G_CALLBACK (on_close_clicked), win);
gtk_widget_show (but);
return win;
}
void
on_open_clicked (GtkButton * button, gpointer user_data)
{
GtkWidget *win = GTK_WIDGET (user_data);
GtkWidget *window2;
window2 = create_window2 (win, FALSE);
gtk_widget_show (window2);
}
static gboolean
on_open_timeout (gpointer user_data)
{
GtkWidget *win = GTK_WIDGET (user_data);
GtkWidget *window2;
window2 = create_window2 (win, TRUE);
gtk_widget_show (window2);
return TRUE;
}
GtkWidget *
create_window1 (void)
{
GtkWidget *win;
GtkWidget *but;
GtkWidget *align;
GtkWidget *hbox;
win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size (GTK_WINDOW (win), 200, 200);
align = gtk_alignment_new (0.5, 0.5, 0, 0);
gtk_container_add (GTK_CONTAINER (win), align);
gtk_widget_show (align);
hbox = gtk_hbox_new (FALSE, 2);
gtk_container_add (GTK_CONTAINER (align), hbox);
gtk_widget_show (hbox);
but = gtk_button_new_from_stock (GTK_STOCK_OPEN);
gtk_box_pack_start (GTK_BOX (hbox), but, FALSE, FALSE, 2);
g_signal_connect (but, "clicked", G_CALLBACK (on_open_clicked), win);
g_timeout_add (100, (GSourceFunc) on_open_timeout, win);
gtk_widget_show (but);
but = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
gtk_box_pack_start (GTK_BOX (hbox), but, FALSE, FALSE, 2);
g_signal_connect (but, "clicked", G_CALLBACK (on_close_clicked), win);
gtk_widget_show (but);
return win;
}
int
main (int argc, char *argv[])
{
GtkWidget *window1;
gtk_init (&argc, &argv);
window1 = create_window1 ();
gtk_widget_show (window1);
g_signal_connect (window1, "destroy", G_CALLBACK (gtk_main_quit), NULL);
gtk_main ();
return 0;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]