Mi programa funciona bien, excepto por un detalle, se va comiendo la memoria de a poco, 4Kb unas 10 veces por segundo, y el liqueo de memoria no lo encuentro, si alguien me puede dar una mano lo agradeceria enormemente
El problema esta aca adentro (de la funcion que adjunto), eso es llamado no mas de 10 veces por segundo, la primera vez todo va bien, pero en la segunda ya empieza da tragar memoria,
quisas me esta faltando liberar algo.
Código:
si necesitan otra funcion la pondre pero creo que el error esta allibool leetodo(bateria &Bateria,gboolean lnombres,gboolean lcarga, gboolean lestado){ GError *el_error = NULL; gboolean result; DBusGProxy *proxy = NULL; proxy = get_dbus_proxy("org.freedesktop.Hal", Bateria.udi.c_str(), "org.freedesktop.Hal.Device"); if(lnombres){ char *nombre, *tipo, *tecnologia; result = dbus_g_proxy_call(proxy, "GetProperty", &el_error, G_TYPE_STRING, "info.product", G_TYPE_INVALID, G_TYPE_STRING, &nombre, G_TYPE_INVALID); if(error_happened(result, el_error)) Bateria.nombre = "N/A"; else{ Bateria.nombre = nombre; g_free(nombre); } el_error = NULL; result = dbus_g_proxy_call(proxy, "GetPropertyString", &el_error, G_TYPE_STRING, "battery.type",G_TYPE_INVALID, G_TYPE_STRING, &tipo, G_TYPE_INVALID); if(error_happened(result, el_error)) Bateria.tipo = "N/A"; else{ Bateria.tipo = tipo; g_free(tipo); } el_error = NULL; result = dbus_g_proxy_call(proxy, "GetProperty", &el_error, G_TYPE_STRING, "battery.reporting.technology", G_TYPE_INVALID, G_TYPE_STRING, &tecnologia, G_TYPE_INVALID); if(error_happened(result, el_error)) Bateria.tecnologia = "N/A"; else{ Bateria.tecnologia = tecnologia; g_free(tecnologia); } } if(lcarga){ gint ultima, ahora; Bateria.carga = 0; el_error = NULL; result = dbus_g_proxy_call(proxy, "GetProperty", &el_error, G_TYPE_STRING, "battery.charge_level.last_full", G_TYPE_INVALID, G_TYPE_INT, &ultima, G_TYPE_INVALID); if(!error_happened(result, el_error)){ el_error = NULL; result = dbus_g_proxy_call(proxy, "GetProperty", &el_error, G_TYPE_STRING, "battery.charge_level.current",G_TYPE_INVALID, G_TYPE_INT, &ahora, G_TYPE_INVALID); if(!error_happened(result, el_error)){ if(ultima < 1) ultima = 1; Bateria.carga = (ahora*100 / ultima*100) /100; } } } if(lestado){ gboolean presente, recargable, cargando, descargando; el_error = NULL; result = dbus_g_proxy_call(proxy, "GetProperty", &el_error, G_TYPE_STRING, "battery.present",G_TYPE_INVALID, G_TYPE_BOOLEAN, &presente,G_TYPE_INVALID); if(!error_happened(result, el_error)){ if(!presente) Bateria.estado = "Missing"; else{ el_error = NULL; result = dbus_g_proxy_call(proxy, "GetProperty", &el_error, G_TYPE_STRING, "battery.is_rechargeable",G_TYPE_INVALID, G_TYPE_BOOLEAN, &recargable,G_TYPE_INVALID); if(!error_happened(result, el_error)){ if(!recargable) Bateria.estado = "Ready"; else{ el_error = NULL; result = dbus_g_proxy_call(proxy, "GetProperty", &el_error, G_TYPE_STRING, "battery.rechargeable.is_charging",G_TYPE_INVALID, G_TYPE_BOOLEAN, &cargando,G_TYPE_INVALID); if(!error_happened(result, el_error)){ if(cargando) Bateria.estado = "Charging"; else{ el_error = NULL; result = dbus_g_proxy_call(proxy, "GetProperty", &el_error, G_TYPE_STRING, "battery.rechargeable.is_discharging",G_TYPE_INVALID, G_TYPE_BOOLEAN, &descargando, G_TYPE_INVALID); if(!error_happened(result, el_error)){ if(descargando) Bateria.estado = "Working"; else Bateria.estado = "Ready"; } } } } } } } } if (proxy != NULL) g_object_unref(proxy); return true; }
Muchas gracias.