GObject - problem, as usual



Hi!

I'm writing some application based on GObject and I have problem when I'm
trying to destroy object. I have two object A and B, A derives from GObject
and B derives from A. I declared my own finalize methods for both objects,
but when I'm destroying B object only B finalize function is executed. When
I remowe B finlize function declaration from B_class_init () A finalize
function is executed normaly. Why B finalize method overrides A finalize
method and what should I do to remoe this overriding? Maybe some parts od my
code will be helpful:

GType A_get_type   (void)   {
  /*PRINT_DBG_IN_FUN_NAME*/

  static GType type = 0;
  if (type == 0) {
     static const GTypeInfo info = {
        sizeof (AClass),
        NULL,   /* base_init */
        NULL,   /* base_finalize */
        A_class_init,   /* class_init */
        NULL,   /* class_finalize */
        NULL,   /* class_data */
        sizeof (A),
        0,      /* n_preallocs */
        NULL    /* instance_init */
     };
     type = g_type_register_static (G_TYPE_OBJECT,
                                    "AType",
                                    &info, 0);
  }
   return type;
}

GType B_get_type   (void)   {
  /*PRINT_DBG_IN_FUN_NAME*/

  static GType type = 0;
  if (type == 0) {
     static const GTypeInfo info = {
        sizeof (BClass),
        NULL,   /* base_init */
        NULL,   /* base_finalize */
        B_class_init,   /* class_init */
        NULL,   /* class_finalize */
        NULL,   /* class_data */
        sizeof (B),
        0,      /* n_preallocs */
        NULL    /* instance_init */
     };
     type = g_type_register_static (A_TYPE,
                                    "BType",
                                    &info, 0);
  }
   return type;
}

static void B_class_init    (gpointer g_class,
                                     gpointer class_data)
{
  PRINT_DBG_IN_FUN_NAME
  GObjectClass   *class = G_OBJECT_CLASS (g_class);
  GParamSpec     *spec;

  g_type_class_add_private (class, sizeof (BPrivate));

  class->constructor = B_constructor;
  class->dispose = B_dispose;
  class->finalize = B_finalize;
  class->set_property = B_set_property;
  class->get_property = B_get_property;
  /* other code */
}

static void A_class_init   (gpointer g_class,
                                    gpointer class_data)
{
  PRINT_DBG_IN_FUN_NAME
  GObjectClass   *class    = G_OBJECT_CLASS (g_class);
  GParamSpec     *spec;

  class->finalize = A_finalize;
  class->set_property = A_set_property;
  class->get_property = A_get_property;
  /* other code */
}

I changed objects names, to make it more legible. PRINT_DBG_IN_FUN_NAME is a
macro, which display function name in console. Here is otput of running
'g_object_unref (g_object_new (A_TYPE, NULL))'. This is program output:

Function: A_class_init
Function: B_class_init
Function: B_constructor
Function: B_dispose
Function: B_finalize

I noticed, that in both *_class_init fnctions I use GObjectClass to declare
finalize, constructor etc. functions on it, is this main reason of my
problem?

--
Pozdrawiam!
Tom



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