Документация по этим функциям гласит:
Если данный ключ уже существует в GTree, его соответствующему значению присваивается новое значение.Если вы указали value_destroy_func
при создании GTree, старое значение будет освобождено с помощью этой функции.Если вы указали key_destroy_func
при создании GTree, переданный ключ освобождается с помощью этой функции.
Поэтому дублирование ключей не допускается.Значение будет просто перезаписано.
Вам нужно выделить ключ и значение отдельно и использовать g_tree_new_full
для создания дерева, обеспечивающего функции уничтожения.
Таким образом, ваш код должен выглядеть следующим образом:
#include <glib.h>
#include <stdio.h>
int cmp(const void *a, const void *b, void *data)
{
int *ia = (int *) a;
int *ib = (int *) b;
return (*ia - *ib);
}
int main(void)
{
GTree* teste = g_tree_new_full(&cmp, NULL, &free, NULL);
for(int i = 0; i < 10; i++){
int *kv = malloc(sizeof i);
*kv = i;
g_tree_insert(teste, kv, kv);
printf("%d", g_tree_nnodes(teste));
}
putchar('\n');
g_tree_unref(teste);
}