PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : GTK - speicher freigeben?



cybercrow
24-09-2003, 21:20
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.

Silver
24-09-2003, 21:48
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

cybercrow
24-09-2003, 22:01
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."

Trillian
25-09-2003, 15:04
Wie da schon steht, gibt g_list_free() nicht die Nutzdaten der Listenknoten frei, darum musst du dich selber kümmern.

cybercrow
25-09-2003, 16:14
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:


void freigeben (gpointer elementzeiger, gpointer data)
{
g_free(elementzeiger);
}

...

g_list_foreach(liste, freigeben, NULL);
g_list_free(liste);

...

Trillian
25-09-2003, 17:38
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 ;)

Silver
25-09-2003, 18:33
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

cybercrow
25-09-2003, 19:08
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?

Silver
25-09-2003, 19:37
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

Trillian
25-09-2003, 19:43
War wohl sowas?



gchar *foo = g_strdup("bar");
g_free(foo);


Wenn du das _nicht_ machst, gehörst zu verhauen ;)

cybercrow
25-09-2003, 20:05
Original geschrieben von Trillian
War wohl sowas?



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 :rolleyes:

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

cybercrow
25-09-2003, 20:09
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...

Trillian
25-09-2003, 20:39
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:



gboolean search_entry_key_press(GtkWidget *entry, GdkEventKey *event, gpointer data)
{
if (event->keyval == GDK_Return)
values_add(...);

return FALSE;
}


HTH

cybercrow
25-09-2003, 21:01
Ich bekomme beim compileren immer die Fehlermeldung:

`GDK_Return' undeclared (first use in this function)

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


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

Danke!