2016-03-28 10 views
-1

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?

+0

Für was es wert ist, sind Statussymbole ab 3.14 offiziell veraltet. –

+0

@BrianMcFarland Ja, das sind sie. Aber ich würde sie trotzdem gerne benutzen, weil Benachrichtigungen nicht meinen Bedürfnissen entsprechen. –

+1

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

Antwort

1

Für meine Zwecke war die Antwort auf diese Frage, dass es keine Möglichkeit gibt, Valgrind Bericht keine Verluste auf meinem leckfreien Programm zu machen. Es sind verschiedene Unterdrückungsdateien verfügbar, einschließlich one referenced by the people at GNOME. Es gibt eine erhebliche Anzahl von Bugs, die in Bezug auf dieses Problem gegen GTK + gemeldet wurden, und mindestens einige stack overflow threads. Ich fand heraus, dass keine der Unterdrückungsdateien, die ich ausprobierte, für mich funktionierte, und das Erzeugen meiner eigenen war eine Zeitverschwendung.

+0

Nach mehr als einem Jahr akzeptiere ich dies als eine Lösung. Jetzt verstehe ich, warum sich jeder über GTK beschwert. Ich denke, deine Antwort beschreibt die Situation gut. –

+0

Und vielen Dank für Ihre Antwort! –