使用gdbus-codegen生成的代码时如何插入内存泄漏?

时间:2015-02-06 09:44:46

标签: c++ c glib dbus gdbus

我有一个用DBus Introspection XML格式描述的接口:

<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
                      "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<node>
  <interface name="com.example.foo">
    <method name="Bar" />
  </interface>
</node>

我像这样运行gdbus-codegen:

gdbus-codegen --interface-prefix=com.example --generate-c-code=foo-dbus --c-namespace=Dbus foo.xml

我使用这样的代码:

int main()
{
    DbusFoo * skeleton = dbus_foo_skeleton_new();
    g_object_unref(skeleton);

    return 0;
}

但应用程序最终会泄漏dbus_foo_default_init()中生成的信号,如下所示:

static void
dbus_foo_default_init (DbusFooIface *iface)
{
  /* GObject signals for incoming D-Bus method calls: */
  /**
   * DbusFoo::handle-bar:
   * @object: A #DbusFoo.
   * @invocation: A #GDBusMethodInvocation.
   *
   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-com-example-foo.Bar">Bar()</link> D-Bus method.
   *
   * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call dbus_foo_complete_bar() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
   *
   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
   */
  g_signal_new ("handle-bar",
    G_TYPE_FROM_INTERFACE (iface),
    G_SIGNAL_RUN_LAST,
    G_STRUCT_OFFSET (DbusFooIface, handle_bar),
    g_signal_accumulator_true_handled,
    NULL,
    g_cclosure_marshal_generic,
    G_TYPE_BOOLEAN,
    1,
    G_TYPE_DBUS_METHOD_INVOCATION);

}

我的问题:

如何在使用gdbus-codegen生成的代码后进行清理?

1 个答案:

答案 0 :(得分:0)

我怀疑你会发现,如果你使用latest GLib suppressions file在valgrind下运行你的程序,就没有泄漏。正如@ptomato在上面的评论中所说,信号计为类型数据,GObject永远不会释放它(除了动态注册类型)。类型数据分配一次(首次使用时),永不释放。别担心。