我想在 linux
中使用 Glib-Dbus
来调用 NetworkManager
的 DBus
方法 . 当我通过 g_dbus_proxy_new_sync 创建 GDBusProxy
然后通过 g_object_unref 释放它时,新创建的 GDBusProxy
似乎不会被释放 . 我使用 pmap -x <pid>
来显示我的进程的内存使用情况,并且 RSS
值不断增加 . 有人能帮我吗?
以下是导致问题的代码:
int main (int argc, char *argv[])
{
GDBusConnection * connection = NULL;
GDBusProxy * proxy = NULL;
GError * error = NULL;
connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM,
NULL,
&error);
g_assert_no_error(error);
error = NULL;
while (1)
{
proxy = g_dbus_proxy_new_sync(connection,
G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS,
NULL,
"org.freedesktop.NetworkManager",
"/org/freedesktop/NetworkManager/Settings",
"org.freedesktop .NetworkManager.Settings",
NULL,
NULL);
g_assert(proxy != NULL);
g_object_unref(proxy);
}
g_object_unref(connection);
return 0;
}
提前致谢
3 回答
这个错误报告(已应用于glib git存储库)附带了一个补丁,可以解决您的问题:https://bugzilla.gnome.org/show_bug.cgi?id=758641
据推测它将在glib-2.46.3和/或glib-2.48中 . 似乎只是在glib-2.46分支中合并 .
GLib和相关库不使用系统
malloc/free
对;他们通常采用内部板块分配器 . 这意味着只读取top
或pmap
的输出对于确定GLib或使用GLib的任何应用程序是否实际泄漏没有任何帮助:您应该使用Valgrind,并确保阅读this wiki page以获取有关如何将Valgrind与使用GLib的应用程序一起使用的一些详细信息 .
您可以使用Valgrind找出程序中的内存泄漏 .