Глядя на код, который вы указали, я хотел бы использовать g_tree_new_full ()
вместо g_tree_new ()
в вашем коде C.
Вы повторно используете tree
какисходящий аргумент в коде Vala.Таким образом, при втором вызове первое значение, присвоенное tree
, должно быть освобождено.Я надеюсь, что Вала сгенерирует вызов, чтобы сделать это, но я не написал никакого примера кода для проверки.Вы можете скомпилировать свой код Vala с помощью переключателя --ccode
на valac
, чтобы проверить сгенерированный C.
Пока Vala вызывает g_tree_unref ()
, тогда настройка вашего кода C неосвобождая вложенное дерево.Вам нужна функция GDestroyNotify
для передачи вложенного дерева в g_tree_new_full ()
.
Обновление
Ошибка в вашем C-коде.Ваш код C должен быть:
#include <glib.h>
gint treeCompareFunction (gint a, gint b);
void extern c_function (GTree **tree) {
*tree = g_tree_new_full ((GCompareFunc)treeCompareFunction,
NULL,
NULL,
g_tree_unref
);
for (int i = 0; i < 3; i++) {
GTree * nestedTree = g_tree_new ((GCompareFunc)treeCompareFunction);
g_tree_insert (nestedTree, i, "value 1");
g_tree_insert (*tree, i, (gpointer) nestedTree);
}
}
gint treeCompareFunction (gint a, gint b) {
if (a < b) return -1;
if (a == b) return 0;
return 1;
}
Обратите внимание на использование g_tree_unref
в качестве функции GDestroyNotify
при использовании g_tree_new_full
.
Теперь в сводке утечек Valgrind сообщается:
==22035== LEAK SUMMARY:
==22035== definitely lost: 0 bytes in 0 blocks
==22035== indirectly lost: 0 bytes in 0 blocks
==22035== possibly lost: 1,352 bytes in 18 blocks
Раньше, с кодом в вашем вопросе, сводка утечек была:
==21436== LEAK SUMMARY:
==21436== definitely lost: 288 bytes in 6 blocks
==21436== indirectly lost: 240 bytes in 6 blocks
==21436== possibly lost: 1,352 bytes in 18 blocks