Well thanks for the response. Unfortunately it raises more questions
for me than answers. First, the philosphical ones:
1. /* And override the finalize method here */
static void
class_init (PGCClass *klass)
I take it your typo was in the comment rather than the code?
2. static void finalize (GObject *object)
This is a CLASS finalize function, yes? Why therefore does it
take an OBJECT as it's argument? This seems especially
inconsistent, when the class_init function takes a CLASS.
3. Why is it necessary to bother about the
object_class->finalize = finalize;
line, when there is a field in the Typeinfo structure to specify
the finalise function. Is it necessary to specify it twice? If
so, it seems a bit precarious to me.
4. G_OBJECT_CLASS (parent_class)->finalize (object);
By reading other examples in the docs, I take it that
parent_class is a static (file scoped) variable, (not a member
of any struct). It seems odd to me that such a loose variable
should be necessary, when everything else is nicely encapsulated
either in the class or object variables.
And the practical demo:
1. When I put the code in that you suggested I get the following
run time messages:
(process:9485): GLib-GObject-WARNING **: class finalizer specified for static type `PGClient'
(process:9485): GLib-GObject-WARNING **: class finalizer specified for static type `PGClient'
(process:9485): GLib-GObject-CRITICAL **: file gobject.c: line 588 (g_object_new): assertion
`G_TYPE_IS_OBJECT (object_type)' failed
(process:9485): GLib-GObject-WARNING **: invalid cast from (NULL) pointer to `<invalid>'
** ERROR **: file pgclient.c: line 68 (pgclient_new): assertion
failed: (pg)
2. So I replaced the ClassFinaliseFunc pointer in the typeinfo
struct (see point 3. above) to see what happens. This time,
there's no run time errors, but the finalize func never gets
called (as evidenced by a g_print() diagnostic that I put in.
Sorry to be so critical, but it seems that creating a fairly simple
gobject is not easy for a first time user.
J'
On Tue, Nov 05, 2002 at 10:29:51AM +0000, iain wrote:
On Mon, 2002-11-04 at 12:18, John Darrington wrote:
>
> My Questions are:
>
> 1. The Finalize func undoes the Init func. Fair enough. But why is
> there no GInstanceFinalizeFunc? See example below:
All objects I've ever written have had NULL for everything except the
GClassInitFunc and GInstanceInitFunc.
Actually I think I had one that had NULL for GInstanceInitFunc too once.
So basically, you don't need to worry about them.
>
> I have a gobject, whose _new function looks like :
>
> GObject*
> pgc_new(const gchar *c)
> {
> PGC *pg;
>
> pg = PGC(g_object_new(TYPE_PGC,0));
>
> g_assert(pg);
>
> pg->info = g_strdup(c);
>
> return G_OBJECT(pg);
>
> }
>
>
> Now the doco for g_strdup says that the pointer returned must be freed
> when no longer needed. But how and when can I do that ?? It needs to
> be freed when the object is destroyed, but there is no
> GInstanceFinalizeFunc which (to me) would seem the logical thing to
> have.
>
Override either the dispose or the finalize methods of the GObjectClass
like so.
static void
finalize (GObject *object)
{
PGC *pg;
pg = PGC(object);
g_free (pg->info);
/* Other things here */
/* Chain up to the parents finalize */
G_OBJECT_CLASS (parent_class)->finalize (object);
}
/* And override the finalize method here */
static void
class_init (PGCClass *klass)
{
GObjectClass *object_class;
object_class = G_OBJECT_CLASS (klass);
object_class->finalize = finalize;
}
Now whenever the object is destroyed, the memory will be freed.
iain
--
"This way of life is so devised,
To snuff out the mind that moves"
--
PGP Public key ID: 1024D/2DE827B3
fingerprint = 8797 A26D 0854 2EAB 0285 A290 8A67 719C 2DE8 27B3
See http://www.keyserver.net or any PGP keyserver for public key.
Attachment:
pgpABf9TUVrUL.pgp
Description: PGP signature