1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
| #include <gtk/gtk.h>
void print_ref_count(GtkWidget *widget, const char *name)
{
g_debug("'%s' a %d reference(s)%s",
name,
G_OBJECT(widget)->ref_count,
g_object_is_floating(widget) ? " flottante" : "");
}
int main (int argc, char *argv[])
{
GtkWidget *vbox;
GtkWidget *label;
GtkWidget *button;
gtk_init (&argc, &argv);
// Avec ça vous aurez les messages de debug
g_setenv("G_MESSAGES_DEBUG", "all", TRUE);
g_debug("Création de label et vbox");
label = gtk_label_new("...");
vbox = gtk_vbox_new(FALSE, 0);
print_ref_count(label, "label");
print_ref_count(vbox, "vbox");
g_debug("Ajout du label dans la vbox: la référence du label devient réelle et plus flottante");
gtk_container_add(GTK_CONTAINER(vbox), label);
print_ref_count(label, "label");
print_ref_count(vbox, "vbox");
g_debug("Avant de retirer label de la vbox, on va lui ajouter une référence pour éviter sa destruction");
g_object_ref(label);
print_ref_count(label, "label");
g_debug("Retrait de label de la vbox: label existe toujours puisqu'on possède une référence sur lui");
gtk_container_remove(GTK_CONTAINER(vbox), label);
print_ref_count(label, "label");
print_ref_count(vbox, "vbox");
et regardez le code
g_debug("Ajout une nouvelle fois du label dans la vbox");
gtk_container_add(GTK_CONTAINER(vbox), label);
print_ref_count(label, "label");
print_ref_count(vbox, "vbox");
g_debug("On retire la référence sur label qu'on a ajouté manuellement quand on a appelé g_object_ref");
g_object_unref(label);
print_ref_count(label, "label");
g_debug("Retrait de label de la vbox: label va être détruit car la vbox était la dernière à posséder une référence sur le label");
gtk_container_remove(GTK_CONTAINER(vbox), label);
print_ref_count(label, "label"); // Attention, ici on accède à de la mémoire qui n'est plus allouée !!!!
print_ref_count(vbox, "vbox");
g_debug("Création de button");
button = gtk_button_new();
print_ref_count(button, "button");
g_debug("Ajout de button dans la vbox: la référence de button devient réelle et plus flottante");
gtk_container_add(GTK_CONTAINER(vbox), button);
print_ref_count(button, "button");
print_ref_count(vbox, "vbox");
g_debug("On 'coule' (transforme la référence flottante en référence réelle) la référence de vbox.\n"
"Autrement on aurait un warning à la destruction, car c'est bizarre de détruire quelque chose qu'on a pas utilisé.");
g_object_ref_sink(vbox);
print_ref_count(vbox, "vbox");
g_debug("On tente de détruire la vbox: que deviennent vbox et button ?");
g_object_unref(vbox);
// gtk_widget_destroy(vbox);
print_ref_count(button, "button");
print_ref_count(vbox, "vbox");
return 0;
} |
Partager