<!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.74.3"> <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.11 (XML mode)"> <link rel="stylesheet" href="style.css" type="text/css"> <link rel="preface" href="pr01.html" title="Introduction"> <link rel="part" href="pt01.html" title="Part I. Concepts"> <link rel="chapter" href="chapter-intro.html" title="Background"> <link rel="chapter" href="chapter-gtype.html" title="The GLib Dynamic Type System"> <link rel="chapter" href="chapter-gobject.html" title="The GObject base class"> <link rel="chapter" href="chapter-signal.html" title="The GObject messaging system"> <link rel="reference" href="rn01.html" title="API Reference"> <link rel="reference" href="rn02.html" title="Tools Reference"> <link rel="part" href="pt02.html" title="Part IV. Tutorial"> <link rel="chapter" href="howto-gobject.html" title="How to define and implement a new GObject"> <link rel="chapter" href="howto-interface.html" title="How to define and implement interfaces"> <link rel="chapter" href="howto-signals.html" title="How to create and use signals"> <link rel="part" href="pt03.html" title="Part V. Related Tools"> <link rel="chapter" href="tools-vala.html" title="Vala"> <link rel="chapter" href="tools-gob.html" title="GObject builder"> <link rel="chapter" href="tools-ginspector.html" title="Graphical inspection of GObjects"> <link rel="chapter" href="tools-refdb.html" title="Debugging reference count problems"> <link rel="chapter" href="tools-gtkdoc.html" title="Writing API docs"> <link rel="index" href="ix01.html" title="Index"> <link rel="index" href="ix02.html" title="Index of deprecated symbols"> <link rel="index" href="ix03.html" title="Index of new symbols in 2.2"> <link rel="index" href="ix04.html" title="Index of new symbols in 2.4"> <link rel="index" href="ix05.html" title="Index of new symbols in 2.6"> <link rel="index" href="ix06.html" title="Index of new symbols in 2.8"> <link rel="index" href="ix07.html" title="Index of new symbols in 2.10"> <link rel="index" href="ix08.html" title="Index of new symbols in 2.12"> <link rel="index" href="ix09.html" title="Index of new symbols in 2.14"> <link rel="index" href="ix10.html" title="Index of new symbols in 2.18"> </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" lang="en"> <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. the section called “g_object_unref ()”">Table 5, “the section called “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.11</div> </body> </html>