Hi Kjell, I've taken a very quick look into the first stage that you
described (delete some_adjuster):-
On 28/11/2013 09:54, Kjell Ahlstedt wrote:
This is what shall happen, and what does happen when I run the test:
_delete some_adjuster;_
Gtk::Object::~Object() calls Gtk::Object::_destroy_c_instance(), which
calls g_object_unref().
The call to g_object_unref() does not remove the last reference to
GtkAdjustment. Therefore Glib::ObjectBase::destroy_notify_callback_()
is not called.
Gtk::Object::_destroy_c_instance() calls
Gtk::Object::disconnect_cpp_wrapper(), which calls
g_object_steal_qdata() and g_object_set_qdata().
Hmmm... I do end up with g_object_steal_data() and g_object_set_data()
getting called but the path is somewhat different to the one you
described. In fact, Gtk::Object::~Object() hasn't even been reached by
the time those functions get called. Here's the sequence that I see...
1) Adjustment::~Adjustment()
2) Object::destroy_()
3) Object::_destroy_c_instance()
4) g_object_unref() (which essentially does nothing)
5) gtk_object_destroy()
6) g_object_run_dispose()
7) gtk_object_dispose()
8) g_object_real_dispose() (which does something to do with quarks)
9) Object::disconnect_cpp_wrapper() (which calls those 'steal_data()'
and 'set_data()' functions)
9a) The above call also sets 'gobject_' to NULL but does not free up any
memory associated with it.
10) Object::~Object()
11) Object::_destroy_c_instance() (gets called a second time but does
nothing now because 'gobject_ == 0'
But the conclusion of your statement is essentially correct. This
convoluted sequence ensures that
Glib::ObjectBase::destroy_notify_callback_() does not get called when
deleting 'some_adjuster'. And consequently the line "delete this;" (in
'ObjectBase::destroy_notify_()') doesn't get reached either.
Nevertheless, 'some_adjuster' does get deleted of course (the CRT
deletes it).
Tomorrow I'll look into what's happening when we delete the
Gtk::SpinButton. For example, is it assuming that the above actions
somehow prevented the Gtk::Adjustment from getting deleted?
John
_______________________________________________
gtkmm-list mailing list
gtkmm-list@gnome.org
https://mail.gnome.org/mailman/listinfo/gtkmm-list