Anzeige:
Ergebnis 1 bis 14 von 14

Thema: GTK - speicher freigeben?

  1. #1
    Registrierter Benutzer
    Registriert seit
    19.04.2001
    Beiträge
    159

    GTK - speicher freigeben?

    hy!
    ich habe ein kleines Programm mit GTK+ geschrieben, das interface habe ich mit glade erstellt. An den quit-button habe ich das signal gtk_main_quit gebunden, so dass das Programm dadurch beendet wird.
    In der callback.c habe ich eine GList definiert in der ich während des Programmablaufes Daten speicher.

    Meine Frage ist jetzt, ob durch den Aufruf von gtk_main_quit der Speicher wieder freigegeben wird, oder ob da nachher die GList noch als Speicher-Leiche im Arbeitsspeicher bleibt? Von C bin ich es nämlich gewöhnt den Speicher vor dem beenden wieder frei zu geben.

    "I could have made some money developing proprietary software, and perhaps amused myself writing code. But I knew that at the end of my career, I would look back on years of building walls to divide people, and feel I had spent my life making the world a worse place."
    -- Richard M. Stallman

    Wissenskommunismus und Wissenskapitalismus
    Offene Quellen und öffentliches Wissen
    und vieles mehr: VRG's Texts , Philosophy of the GNU Project

  2. #2
    Registrierter Benutzer
    Registriert seit
    19.04.2003
    Beiträge
    194
    nö, gtk_main_quit gibt nur den speicher für die Widgets, etc. frei. G(S)List, GTree, etc. wird nicht freigegeben, da musst du dich selbst kümmern!

    mfg
    Going to church does not make a person religious, nor does going to school make a person educated, any more than going to a garage makes a person a car.

  3. #3
    Registrierter Benutzer
    Registriert seit
    19.04.2001
    Beiträge
    159
    Danke für die schnelle Antwort.
    D.h. ich kann mit dem quit button nicht direkt gtk_main_quit aufrufen, sondern eine on_QuitButton_clicked funktion.
    Dann kann ich diese Funktion in callback.c ausprogrammieren und den Speicher freigeben und danach gtk_main_quit() aufrufen.

    g_list_free(liste) reicht doch um den Speicher freizugeben, oder?
    Weil in meinem GTK+ Buch steht dazu:
    "Die GLib haben keine Möglichkeit zu wissen, ob und wie die Datenblöcke alloziert worden sind. g_list_free() kan daher nur den Listenknoten und nicht die Daten freigeben. Falls sie eine GList freigeben und keinen Zeiger mehr auf die Datenblöcke haben, ist das ein Speicherleck, wie es leibt und lebt."
    Geändert von cybercrow (24-09-2003 um 22:26 Uhr)

    "I could have made some money developing proprietary software, and perhaps amused myself writing code. But I knew that at the end of my career, I would look back on years of building walls to divide people, and feel I had spent my life making the world a worse place."
    -- Richard M. Stallman

    Wissenskommunismus und Wissenskapitalismus
    Offene Quellen und öffentliches Wissen
    und vieles mehr: VRG's Texts , Philosophy of the GNU Project

  4. #4
    Registrierter Benutzer Avatar von Trillian
    Registriert seit
    26.04.2001
    Beiträge
    180
    Wie da schon steht, gibt g_list_free() nicht die Nutzdaten der Listenknoten frei, darum musst du dich selber kümmern.

  5. #5
    Registrierter Benutzer
    Registriert seit
    19.04.2001
    Beiträge
    159
    Original geschrieben von Trillian
    Wie da schon steht, gibt g_list_free() nicht die Nutzdaten der Listenknoten frei, darum musst du dich selber kümmern.
    heißt das ich muß jedes element durchgehen und einzeln freigeben?
    Also so in der Art:
    Code:
    void freigeben (gpointer elementzeiger, gpointer data)
    {
        g_free(elementzeiger);
    }
    
    ...
    
    g_list_foreach(liste, freigeben, NULL);
    g_list_free(liste);
    
    ...

    "I could have made some money developing proprietary software, and perhaps amused myself writing code. But I knew that at the end of my career, I would look back on years of building walls to divide people, and feel I had spent my life making the world a worse place."
    -- Richard M. Stallman

    Wissenskommunismus und Wissenskapitalismus
    Offene Quellen und öffentliches Wissen
    und vieles mehr: VRG's Texts , Philosophy of the GNU Project

  6. #6
    Registrierter Benutzer Avatar von Trillian
    Registriert seit
    26.04.2001
    Beiträge
    180
    Ich fürchte, ja. Gibts keine Version der g_list_free() Funktion, der man direkt einen Callback dafür übergeben kann? IIRC gabs da was, kann aber auch bei GHashTable gewesen sein

  7. #7
    Registrierter Benutzer
    Registriert seit
    19.04.2003
    Beiträge
    194
    Original geschrieben von cybercrow

    Weil in meinem GTK+ Buch steht dazu:
    "Die GLib haben keine Möglichkeit zu wissen, ob und wie die Datenblöcke alloziert worden sind. g_list_free() kan daher nur den Listenknoten und nicht die Daten freigeben. Falls sie eine GList freigeben und keinen Zeiger mehr auf die Datenblöcke haben, ist das ein Speicherleck, wie es leibt und lebt."
    *g* auch stolzer Besitzer vom Gnome 2 Buch von Herrn Warkus? Oder hat da ein Autor von einem anderen kopiert *g*?!?

    mfG
    Going to church does not make a person religious, nor does going to school make a person educated, any more than going to a garage makes a person a car.

  8. #8
    Registrierter Benutzer
    Registriert seit
    19.04.2001
    Beiträge
    159
    Original geschrieben von Silver
    *g* auch stolzer Besitzer vom Gnome 2 Buch von Herrn Warkus? Oder hat da ein Autor von einem anderen kopiert *g*?!?
    stimmt, ist das Buch von Matthias Warkus

    PS: Zu der Speicher-Freigeben-Geschichte: Ich habe gtk+ Beispiele gesehen in denen eine char Variable (in der Funktion deklariert) am Ende der funktion mit g_free(variable) wieder freigegeben wurde. Muß man das machen? Das ist ja eigentlich kein dynamisch allocierter Speicher?
    Geändert von cybercrow (25-09-2003 um 19:11 Uhr)

    "I could have made some money developing proprietary software, and perhaps amused myself writing code. But I knew that at the end of my career, I would look back on years of building walls to divide people, and feel I had spent my life making the world a worse place."
    -- Richard M. Stallman

    Wissenskommunismus und Wissenskapitalismus
    Offene Quellen und öffentliches Wissen
    und vieles mehr: VRG's Texts , Philosophy of the GNU Project

  9. #9
    Registrierter Benutzer
    Registriert seit
    19.04.2003
    Beiträge
    194
    Original geschrieben von cybercrow

    PS: Zu der Speicher-Freigeben-Geschichte: Ich habe gtk+ Beispiele gesehen in denen eine char Variable (in der Funktion deklariert) am Ende der funktion mit g_free(variable) wieder freigegeben wurde. Muß man das machen? Das ist ja eigentlich kein dynamisch allocierter Speicher?
    Du meinst wohl einen GString. denn wenn du ein gchar, bzw. ein gchararray mittels g_free "freimachen" willst, wird er dich wohl aufhauen.

    mfG
    Going to church does not make a person religious, nor does going to school make a person educated, any more than going to a garage makes a person a car.

  10. #10
    Registrierter Benutzer Avatar von Trillian
    Registriert seit
    26.04.2001
    Beiträge
    180
    War wohl sowas?

    Code:
    gchar *foo = g_strdup("bar");
    g_free(foo);
    Wenn du das _nicht_ machst, gehörst zu verhauen

  11. #11
    Registrierter Benutzer
    Registriert seit
    19.04.2001
    Beiträge
    159
    Original geschrieben von Trillian
    War wohl sowas?

    Code:
    gchar *foo = g_strdup("bar");
    g_free(foo);
    Wenn du das _nicht_ machst, gehörst zu verhauen
    ja stimmt, ich habe nochmal nachgesehen, war sowas in der Art

    Dann ist es klar, als ich die Frage gestellt habe ging ich noch von einem "festen" char aus (char foo[19]).

    "I could have made some money developing proprietary software, and perhaps amused myself writing code. But I knew that at the end of my career, I would look back on years of building walls to divide people, and feel I had spent my life making the world a worse place."
    -- Richard M. Stallman

    Wissenskommunismus und Wissenskapitalismus
    Offene Quellen und öffentliches Wissen
    und vieles mehr: VRG's Texts , Philosophy of the GNU Project

  12. #12
    Registrierter Benutzer
    Registriert seit
    19.04.2001
    Beiträge
    159
    Da wir gerade so schön beisammen sind

    Wenn ich ein ganz einfaches Programm habe:
    2 gtk-spin-buttons in denen Zahlen eingegeben werden können und diese auf button click addiert werden.
    Gibt es eine Möglichkeit die button-click Funktion auch aufzurufen wenn ich im zweiten spin-button enter drücke?
    ich konnte dafür bisher nichts finden...

    "I could have made some money developing proprietary software, and perhaps amused myself writing code. But I knew that at the end of my career, I would look back on years of building walls to divide people, and feel I had spent my life making the world a worse place."
    -- Richard M. Stallman

    Wissenskommunismus und Wissenskapitalismus
    Offene Quellen und öffentliches Wissen
    und vieles mehr: VRG's Texts , Philosophy of the GNU Project

  13. #13
    Registrierter Benutzer Avatar von Trillian
    Registriert seit
    26.04.2001
    Beiträge
    180
    Klar, wieso nicht?

    Schreib dir eine Funktion values_add(), und die rufst du aus den Callbacks für das key-press Event (falls Enter) und für das Click-Event auf.

    Das Event heißt "key-press-event" und der Callback sieht so aus:

    Code:
    gboolean search_entry_key_press(GtkWidget *entry, GdkEventKey *event, gpointer data)
    {
        if (event->keyval == GDK_Return)
    		values_add(...);
    
        return FALSE;
    }
    HTH

  14. #14
    Registrierter Benutzer
    Registriert seit
    19.04.2001
    Beiträge
    159
    Ich bekomme beim compileren immer die Fehlermeldung:

    `GDK_Return' undeclared (first use in this function)

    Muß man dafür eine spezielle Header-Datei einbinden?

    [EDIT]
    Habs gefunden, man braucht #include <gdk/gdkkeysyms.h>

    Danke!
    [/EDIT]
    Geändert von cybercrow (25-09-2003 um 21:46 Uhr)

    "I could have made some money developing proprietary software, and perhaps amused myself writing code. But I knew that at the end of my career, I would look back on years of building walls to divide people, and feel I had spent my life making the world a worse place."
    -- Richard M. Stallman

    Wissenskommunismus und Wissenskapitalismus
    Offene Quellen und öffentliches Wissen
    und vieles mehr: VRG's Texts , Philosophy of the GNU Project

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •