gpt4 book ai didi

c++ - 使用 gdbus-codegen 生成的代码时如何堵塞内存泄漏?

转载 作者:太空宇宙 更新时间:2023-11-04 04:38:59 32 4
gpt4 key购买 nike

我有一个以 DBus Introspection XML 格式描述的接口(interface):

<!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 生成的代码后如何清理?

最佳答案

我怀疑您会发现,如果您使用 latest GLib suppressions file 在 valgrind 下运行您的程序(在大多数 Linux 发行版的 /usr/share/glib-2.0/valgrind/ 中安装了一个版本),没有泄漏。正如@ptomato 在上面的评论中所说,信号算作类型数据,而 GObject 从不释放它(除了动态注册的类型)。类型数据分配一次(首次使用时)并且永远不会释放。别担心。

关于c++ - 使用 gdbus-codegen 生成的代码时如何堵塞内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28362797/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com