LINUX.ORG.RU

GtkListStore/GtkTreeModel: вопросы


0

0

В силу того, что код для изучения, использующий GtkListStore попадается противоречивый, у меня возникло пара вопросов:

1. Как надо правильно освобождать память из под элементов в GtkListStore в конце работы? gtk_list_store_clear()? Встретил код, где итеративно с помощью gtk_tree_model_get() берутся элементы и им делается g_free() -- но, насколько я понимаю, удаляются только копии элементов, а не сами элементы.

2. Что происходит с предыдущим элементом в GtkListStore, когда я делаю gtk_tree_model_set() по существующему итератору? Ведь память из под него не освобождается? Как правильно удалить предыдующий элемент в модели перед тем как задать новый на его место?

Нужно для подобного, что бы избежать утечек памяти:

GtkTreeIter iter;
struct MyData* data;
...
// Get item
gtk_tree_model_get(model, &iter, 0, &data, -1);

// set new name
g_free(data->name);
data->name = generate_name();

// Update item
gtk_tree_model_set(model, &iter, 0, data, -1);

free_my_struct(data);

Использование gtk_list_store_remove() для этого выглядит несколько брутально, ибо придется городить нечто для случаев, когда заменяется первый/крайний элемент.

Спасибо.

★★★

Уточнить: struct MyData -- это мой, созданный boxed, тип c заданными и реализованными GBoxedCopyFunc и GBoxedFreeFunc функциями; соответственно, column #0 имеет этот тип, заданный при создании GtkListStore.

kondor ★★★
() автор топика

> Ведь память из под него не освобождается?

Если всё правильно написано, и тип зарегистрирован, то освобождается. Модель сама следит за памятью данных. Если уничтожается виджет и, следовательно, делается unref на модель, память должна освободиться.

welkam ★★
()
Ответ на: комментарий от welkam

Да, так и есть -- проверил добавлением g_debug() в функцию, освобождающую память из под boxed-типов.

На второй вопрос я так же нашел ответ: http://scentric.net/tutorial/sec-treemodel-data-manipulation.html -- при перезаписи элемента, память предварительно освобождается. Поэтому утечек памяти быть не должно.

Спасибо за помощь. Вопрос снят.

kondor ★★★
() автор топика
Ответ на: комментарий от kondor

уже ведь был топик про освобождение при gtk_list[tree]_store_clear. Суть такая, если ты хранишь там G_TYPE_POINTER, то за тебя никто не освободит объект, на который ты указываешь этим указателем, все остальное - освобождается. Если ты уничтожаешь TreeView, то и модель, которая к нему подцеплена также будет уничтожена. Если у тебя где-то отдельно болтается модель, то ее простым g_object_unref удаляешь.
Вот собсно и все :).

PS: сори,у меня так и не нашлось времени глянуть еще раз на твои исходники :(. На более мелкие вопросы могу отвечать, стучи в жаббер. Хотя бы так, для контактов, ну или для мелких хинтов, чем смогу - помогу ;).

Deleted
()
Ответ на: комментарий от Deleted

Ага, понял, спасибо. Порой путаюсь как в Gtk+ организован memory management.

kondor ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.