RE: Destroying widgets properly
- From: Murray Cumming Comneon com
- To: thesurprises1 comcast net, Information-Cascade ntlworld com
- Cc: gtk-list gnome org
- Subject: RE: Destroying widgets properly
- Date: Mon, 19 Jan 2004 19:37:50 +0100
Because you mentioned C++, I should mention that memory mangement is IMHO
easier and more C++-like with gtkmm.
Murray Cumming
www.murrayc.com
murrayc usa net
> -----Original Message-----
> From: gtk-list-admin gnome org
> [mailto:gtk-list-admin gnome org] On Behalf Of The Surprises
> Sent: Montag, 19. Januar 2004 01:22
> To: Graham Swallow
> Cc: gtk-list gnome org
> Subject: Re: Destroying widgets properly
>
>
> Thanks for the feedback. I still can't get it to work. I've
> tried numerous combinations of actions with same results.
> I've read that you might have to hide() the widget before
> destroying it to to turn off all events. Tried it. Doesn't
> work. This is frustrating!
>
> On Sun, Jan 18, 2004 at 07:54:47PM +0000, Graham Swallow wrote:
> > Me too.
> >
> > My framework is libs_apps_YEAR-MM_DD.tgz at
> > http://homepage.ntlworld.com/information-cascade/baks/
> > The gtk code is in src/lib_base2/gtk_1/
> >
> > I think I fixed my problem by realising that GTK destroys its
> > own widget, THEN tells with the "destroy" callback, so that
> > C++ can release its storage WITHOUT REFERRING TO GTK
> >
> > The GTK widget object's memory has been free()d, but you are
> > still using it, which either reports "not a valid object",
> > or corrupts indirect memory, and the program trips up LATER.
> >
> > When an upper container is deleted, its children get
> AUTO deleted,
> > so you must avoid deleting them, but delete the C++ objects.
> >
> > I also had an issue with signal_disconnect_by_data().
> > I'd claim it still happens, but have stopped calling it (leak).
> >
> > -OR-
> >
> > An alternative phase I went through, was when C++ deleted its
> > object, when the GTK object is fully alive.
> >
> > Then GTK calls back, with the deleted objects pointer
> > ... chaos ...
> >
> > -Different ways-
> >
> > Different designs require opposite senses. Should your code
> > delete the widget before or after GTK? Do you tell it, or
> > does it tell you?
> >
> > Reference counts can split widget deconstruction into
> > two halves. The DISPLAYED widgets reduction to a skeleton,
> > and later free(widget), with the C++ objects delete somewhere.
> >
> > I do tend to NOT do a refcount on GTK objects, even
> though I keep
> > a pointer to them. My excuse is that I should not have received
> > a "1" count in the first place, which gets absorbed by the PACK
> > action (ASIDE check how TCL does this - it's magically sensible,
> > and NOT how Python does it). So I do nothing (and it now works).
> >
> >
> > Graham
> > Information-Cascade (at) ntlworld.com
> >
> >
> > > Message: 1
> > > Date: Sun, 18 Jan 2004 00:42:46 -0800
> > > From: The Surprises <thesurprises1 comcast net>
> > > To: gtk-list gnome org
> > > Subject: Destroying widgets properly
> > >
> > > Hello,
> > > I am getting mysterious and inconsistent crashes in my
> gtk program
> > > (ie it isn't crashing in the same spot every time), and I
> believe it
> > > has something to do with how I am destroying a set of widgets. I
> > > have an hbox (HB) packed into a vbox (VB). HB has many widgets
> > > packed inside of it, most of which are also created/maintained in
> > > their own C++ classes. One of the widgets is a
> GnomeCanvas, and it
> > > itself has many GnomeCanvasItem children, nearly each
> maintained in
> > > seperate C++ classes as well. At times, I need to
> entirely remove
> > > HB and all of it's children including the canvas and all of it's
> > > children. I then recreate everything from scratch and
> pack into VB.
> > > Actually the destroy seems to work OK. It is when I try
> to recreate
> > > all the widgets that I get the core dump.
> > >
> > > I tried having each class destructor first delete it's children
> > > (with a 'delete'), then destroy it's own widget (in the
> case of the
> > > GnomeCanvasItems, using GTK_OBJECT_DESTROY and casting the
> > > CanvasItem). I thought this made the most sense since you want to
> > > delete the children first before you delete the parent or you'll
> > > have children pointing to parents that no longer exist. I also
> > > tried reversing the order as well but get the same result. I get
> > > error messages like this:
> > >
> > > GLib-GObject-WARNING **: invalid uninstantiatable type
> `gint64' in
> > > cast to `GtkObject'
> > >
> > > Gtk-CRITICAL **: file gtkobject.c: line 358
> > > (gtk_object_destroy): assertion `GTK_IS_OBJECT (object)' failed
> > >
> > > GLib-GObject-WARNING **: invalid cast from `(null)' to `GtkObject'
> > >
> > > Gtk-CRITICAL **: file gtkobject.c: line 358
> > > (gtk_object_destroy): assertion `GTK_IS_OBJECT (object)' failed
> > >
> > >
> > > I tried just doing a destroy on HB but get the same results. It
> > > seems like I'm leaving something behind. It works a few
> times, then
> > > crashes. Or it crashes on the first try.
> > >
> > > Thanks for any help
> > > Jason
> > >
> > >
> > > --__--__--
> > >
> > > _______________________________________________
> > > gtk-list mailing list
> > > gtk-list gnome org http://mail.gnome.org/mailman/listinfo/gtk-list
> > >
> > >
> > > End of gtk-list Digest
> _______________________________________________
> gtk-list mailing list
> gtk-list gnome org http://mail.gnome.org/mailman/listinfo/gtk-list
>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]