Ich versuche, eine gtk status icon zu verwenden, aber ich weiß nicht, wie das ohne Speicherverlust zu tun.Verwenden Sie gtk Statussymbol ohne Speicherverlust
#include <gtk/gtk.h>
GtkWidget *window;
GtkStatusIcon *tray_icon;
static void activate (GtkApplication* app, gpointer user_data)
{
window = gtk_application_window_new (app);
gtk_window_set_title (GTK_WINDOW (window), "Window");
gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
gtk_widget_show_all (window);
return; // <-- When this is commented out, valgrind finds memory leak.
tray_icon = gtk_status_icon_new();
gtk_status_icon_set_visible(tray_icon, TRUE);
gtk_status_icon_set_tooltip_text(tray_icon, "abc");
}
int main (int argc, char **argv)
{
GtkApplication *app;
int status;
app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE);
g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
status = g_application_run (G_APPLICATION (app), argc, argv);
g_object_unref (app);
// Here I am trying to clean it up somehow.
gtk_status_icon_set_visible(tray_icon, FALSE);
g_object_unref(G_OBJECT(tray_icon));
return status;
}
Wenn Statussymbol nicht verwendet wird (return-Anweisung mit Kommentaren in dem Code sehen), findet valgrind keine definitiv oder indirekt verloren Blöcke. Mit Statussymbol meldet valgrind dies:
definitiv verloren: 2.608 Bytes in 7 Blöcken
indirekt verloren: 13.745 Bytes in 554 Blöcken
Wie soll ich den Code korrigiert Statussymbol angezeigt werden, ohne Speicherverlust verursachen?
Für was es wert ist, sind Statussymbole ab 3.14 offiziell veraltet. –
@BrianMcFarland Ja, das sind sie. Aber ich würde sie trotzdem gerne benutzen, weil Benachrichtigungen nicht meinen Bedürfnissen entsprechen. –
Ihr Code zeigt nicht, dass ein Speicherverlust vorliegt, nur dass Valgrind sich über einen Fehler beschwert. GTK und andere komplexe Bibliotheken verwenden Zuordnungsmuster, die von Tools wie valgrind als Leaks falsch gemeldet werden. Eine einfache Möglichkeit, zu testen, ob Sie mit einem echten Speicherverlust zu tun haben oder nicht, besteht darin, den fehlerverdächtigen Code (und dessen Bereinigung) in eine Endlosschleife zu verpacken und den Vorgang mit "top" oder gleichwertig zu beobachten. Wenn sein Speicher grenzenlos wächst, haben Sie ein Leck zur Hand. – user4815162342