Re: Can I use gtk_widget_unref() to releasetthe object created by gtk_invisible_new()?
- Date: Fri, 11 Jan 2008 16:53:07 +0800
- From: Brian Lu <Brian.Lu@xxxxxxx>
- Subject: Re: Can I use gtk_widget_unref() to releasetthe object created by gtk_invisible_new()?
Thanks a lot for your explanation. But look at following snippet from
firefox latest code base:
void InitWidget() {
mWidget = gtk_invisible_new();
gtk_object_ref(GTK_OBJECT(mWidget));
gtk_object_sink(GTK_OBJECT(mWidget));
gtk_widget_ensure_style(mWidget);
mStyle = gtk_widget_get_style(mWidget);
}
see
http://lxr.mozilla.org/seamonkey/source/widget/src/gtk2/nsLookAndFeel.h#77
and
nsLookAndFeel::~nsLookAndFeel()
{
// gtk_widget_destroy(mWidget);
gtk_widget_unref(mWidget);
}
see
http://lxr.mozilla.org/seamonkey/source/widget/src/gtk2/nsLookAndFeel.cpp#78
I find mWidget is leaked (detected by using libumem.so provided by solaris).
I don't understand why calling gtk_object_ref() to increase mWidget
reference count.
This causes mWidget's reference count to be 2 and gtk_widget_unref() in
deconstructor decreases it to 1.
Thanks
Brian
Markku Vire wrote:
> Hi,
>
> The caller doesn't own the returned reference in case of any gtk_*_new
> functions, but the results are floating references (they are removed
> once somebody calls gtk_object_sink). This is different from normal
> GObjects. So, unreffing the returned value causes practically a double
> free.
>
> gtk_widget_destroy in turn runs dispose, ie. asks widget to drop
> references to other widgets. Dropping external references usually causes
> somebody else to drop the last reference to your widget, so it
> efectively gets destroyed. In case of toplevels some global window list
> is holding the reference.
>
> Calling gtk_widget_destroy without taking ownership a a widget is
> usually a bug that causes a memory leak, but this is not the case here,
> since we are talking about a toplevel.
>
> Cheers,
>
> -Markku-
>
> On Wed, 2008-01-09 at 17:39 +0800, Brian Lu wrote:
>
>> Hi, experts,
>>
>> I found following codes will crash in gnome 2.21 environment:
>>
>> ...
>> GtkWidget *foo = gtk_invisible_new();
>> gtk_widget_unref(foo);
>> ...
>>
>> But it works well if gtk_widget_unref() is replaced with
>> gtk_widget_destroy().
>>
>> Does that mean that we can't use gtk_widget_unref() on such object and
>> we can only
>> use gtk_widget_destroy() to release it?
>>
>> Thanks
>>
>> Brian
>> _______________________________________________
>> gtk-devel-list mailing list
>> gtk-devel-list@xxxxxxxxx
>> http://mail.gnome.org/mailman/listinfo/gtk-devel-list
>>
>
>
_______________________________________________
gtk-devel-list mailing list
gtk-devel-list@xxxxxxxxx
http://mail.gnome.org/mailman/listinfo/gtk-devel-list