Приветствую.
Обновил код.
Суть такова: получаем список активных окон в иксах, запускаем на них цикл for, лезем в dbus к сервису bamf для получения информации об этих окнах.
На самом деле функция не main(), а другая, но не суть - она вызывается в бесконечном цикле столько сколько работает главная программа.
При использовании gobject'ных функций дерганья dbus, начинается небольшая утечка памяти, не связанная с количеством итераций. Плюс-минус 100-200 байт в минуту.
Может я как-то не правильно объявляю или не там подчищаю переменные?
/*
Это не важно.
#include <phpcpp.h>
#include <stdlib.h>
#include <stdbool.h>
#include <stdio.h>
#include <glib/gprintf.h>
#include <gio/gio.h>
#include <map>
#include <string>
#include <bits/stdc++.h>
#include <gtk/gtk.h>
#include <gtk/gtkx.h>
#define WNCK_I_KNOW_THIS_IS_UNSTABLE 1
#include <libwnck/libwnck.h>
#include <gdk/gdkx.h>
#include <err.h>
#include <X11/XKBlib.h>
*/
void main() {
WnckScreen *screen;
WnckWindow *active_window;
GList *window_l;
gboolean act;
GError *error = NULL;
screen = wnck_screen_get_default();
wnck_screen_force_update(screen);
active_window = wnck_screen_get_active_window(screen);
GDBusConnection *connection = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, NULL);
int n = 0;
for (window_l = wnck_screen_get_windows(screen); window_l != NULL;
window_l = window_l->next) {
WnckWindow *window = WNCK_WINDOW(window_l->data);
// Только если окно - настоящее, а не панель\меню\рабочий стол
if (wnck_window_get_window_type(window) == WNCK_WINDOW_NORMAL) {
n++;
WnckApplication *app = wnck_window_get_application(window);
unsigned long pid = wnck_window_get_pid(window);
unsigned long xid = wnck_window_get_xid(window);
std::string sxid = std::to_string(xid);
std::string object = "/org/ayatana/bamf/window/" + sxid;
char *newobject = new char[object.length() + 1];
strcpy(newobject, object.c_str());
/*
Вот этот блок, вызывает утечку памяти, не понятно с чем связанную, в рандомные промежутки времени
GDBusMessage *call_message = g_dbus_message_new_method_call(
"org.ayatana.bamf", newobject, "org.ayatana.bamf.view", "Parents");
GDBusMessage *reply_message =
g_dbus_connection_send_message_with_reply_sync(
connection, call_message, G_DBUS_SEND_MESSAGE_FLAGS_NONE, -1,
NULL, NULL, &error);
GVariant *result = g_dbus_message_get_body(reply_message);
g_variant_unref(result);
g_variant_unref(reply_child);
g_object_unref(call_message);
g_object_unref(reply_message);
g_free(error);
*/
}
}
g_object_unref(connection);
}
В оригинальном полном коде - утечка памяти прекращается при закомментировании вот этих функций, т.е. проблема не в других участках кода однозначно.
Прошу прощения за то что криво объясняю - я не программист, и уж тем более не программист на С.
Благодарю.