| <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> |
| <html> |
| <head> |
| <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> |
| <title>Object Destruction</title> |
| <meta name="generator" content="DocBook XSL Stylesheets V1.75.2"> |
| <link rel="home" href="index.html" title="GObject Reference Manual"> |
| <link rel="up" href="howto-gobject.html" title="How to define and implement a new GObject"> |
| <link rel="prev" href="howto-gobject-construction.html" title="Object Construction"> |
| <link rel="next" href="howto-gobject-methods.html" title="Object methods"> |
| <meta name="generator" content="GTK-Doc V1.14 (XML mode)"> |
| <link rel="stylesheet" href="style.css" type="text/css"> |
| </head> |
| <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> |
| <table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle"> |
| <td><a accesskey="p" href="howto-gobject-construction.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td> |
| <td><a accesskey="u" href="howto-gobject.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td> |
| <td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td> |
| <th width="100%" align="center">GObject Reference Manual</th> |
| <td><a accesskey="n" href="howto-gobject-methods.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td> |
| </tr></table> |
| <div class="sect1" title="Object Destruction"> |
| <div class="titlepage"><div><div><h2 class="title" style="clear: both"> |
| <a name="howto-gobject-destruction"></a>Object Destruction</h2></div></div></div> |
| <p> |
| Again, it is often difficult to figure out which mechanism to use to |
| hook into the object's destruction process: when the last |
| <code class="function"><a class="link" href="gobject-The-Base-Object-Type.html#g-object-unref" title="g_object_unref ()">g_object_unref</a></code> |
| function call is made, a lot of things happen as described in |
| <a class="xref" href="gobject-memory.html#gobject-destruction-table" title="Table 5. g_object_unref">Table 5, “g_object_unref”</a>. |
| </p> |
| <p> |
| The destruction process of your object might be split in two different |
| phases: dispose and the finalize. |
| </p> |
| <pre class="programlisting"> |
| #define MAMAN_BAR_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), MAMAN_TYPE_BAR, MamanBarPrivate)) |
| |
| struct _MamanBarPrivate |
| { |
| GObject *an_object; |
| |
| gchar *a_string; |
| }; |
| |
| G_DEFINE_TYPE (MamanBar, maman_bar, G_TYPE_OBJECT); |
| |
| static void |
| maman_bar_dispose (GObject *gobject) |
| { |
| MamanBar *self = MAMAN_BAR (gobject); |
| |
| /* |
| * In dispose, you are supposed to free all types referenced from this |
| * object which might themselves hold a reference to self. Generally, |
| * the most simple solution is to unref all members on which you own a |
| * reference. |
| */ |
| |
| /* dispose might be called multiple times, so we must guard against |
| * calling g_object_unref() on an invalid GObject. |
| */ |
| if (self->priv->an_object) |
| { |
| g_object_unref (self->priv->an_object); |
| |
| self->priv->an_object = NULL; |
| } |
| |
| /* Chain up to the parent class */ |
| G_OBJECT_CLASS (maman_bar_parent_class)->dispose (gobject); |
| } |
| |
| static void |
| maman_bar_finalize (GObject *gobject) |
| { |
| MamanBar *self = MAMAN_BAR (gobject); |
| |
| g_free (self->priv->a_string); |
| |
| /* Chain up to the parent class */ |
| G_OBJECT_CLASS (maman_bar_parent_class)->finalize (gobject); |
| } |
| |
| static void |
| maman_bar_class_init (MamanBarClass *klass) |
| { |
| GObjectClass *gobject_class = G_OBJECT_CLASS (klass); |
| |
| gobject_class->dispose = maman_bar_dispose; |
| gobject_class->finalize = maman_bar_finalize; |
| |
| g_type_class_add_private (klass, sizeof (MamanBarPrivate)); |
| } |
| |
| static void |
| maman_bar_init (MamanBar *self); |
| { |
| self->priv = MAMAN_BAR_GET_PRIVATE (self); |
| |
| self->priv->an_object = g_object_new (MAMAN_TYPE_BAZ, NULL); |
| self->priv->a_string = g_strdup ("Maman"); |
| } |
| </pre> |
| <p> |
| </p> |
| <p> |
| Add similar code to your GObject, make sure the code still builds |
| and runs: dispose and finalize must be called during the last unref. |
| </p> |
| <p> |
| It is possible that object methods might be invoked after dispose is |
| run and before finalize runs. GObject does not consider this to be a |
| program error: you must gracefully detect this and neither crash nor |
| warn the user. |
| </p> |
| </div> |
| <div class="footer"> |
| <hr> |
| Generated by GTK-Doc V1.14</div> |
| </body> |
| </html> |