Форум — Development gtk_list_store_clear() 0 0 Освобождается ли память из под элементов, хранящихся в GtkListStore* при вызове gtk_list_store_clear() ? Спасибо. Ссылка
Ответ на: комментарий от anonymous 29.09.08 00:16:13 MSK неверный ответ. исходники glib смотрел? Deleted (29.09.08 08:40:53 MSK) Показать ответ Ссылка
Ответ на: комментарий от Deleted 29.09.08 08:40:53 MSK О! Поведайте-ка нам как узнать ответ по вопросу о gtk в glib. Я бы не отказался от такой магии. Ладно, если надо развёрнутый ответ. Цитато №1 (gtk/gtkliststore.c) void gtk_list_store_clear (GtkListStore *list_store) { GtkTreeIter iter; g_return_if_fail (GTK_IS_LIST_STORE (list_store)); while (g_sequence_get_length (list_store->seq) > 0) { iter.stamp = list_store->stamp; iter.user_data = g_sequence_get_begin_iter (list_store->seq); gtk_list_store_remove (list_store, &iter); } gtk_list_store_increment_stamp (list_store); } Видно, что из списка удаляется по одному элементу (iter.user_data указывает на начало списка столбцов). Цитато №2 (gtk/gtkliststore.c) gboolean gtk_list_store_remove (GtkListStore *list_store, GtkTreeIter *iter) { GtkTreePath *path; GSequenceIter *ptr, *next; g_return_val_if_fail (GTK_IS_LIST_STORE (list_store), FALSE); g_return_val_if_fail (VALID_ITER (iter, list_store), FALSE); path = gtk_list_store_get_path (GTK_TREE_MODEL (list_store), iter); ptr = iter->user_data; next = g_sequence_iter_next (ptr); _gtk_tree_data_list_free (g_sequence_get (ptr), list_store->column_headers); g_sequence_remove (iter->user_data); list_store->length--; gtk_tree_model_row_deleted (GTK_TREE_MODEL (list_store), path); gtk_tree_path_free (path); if (g_sequence_iter_is_end (next)) { iter->stamp = 0; return FALSE; } else { iter->stamp = list_store->stamp; iter->user_data = next; return TRUE; } } Цитато №3 (gtk/gtktreedatalist.c) void _gtk_tree_data_list_free (GtkTreeDataList *list, GType *column_headers) { GtkTreeDataList *tmp, *next; gint i = 0; tmp = list; while (tmp) { next = tmp->next; if (g_type_is_a (column_headers [i], G_TYPE_STRING)) g_free ((gchar *) tmp->data.v_pointer); else if (g_type_is_a (column_headers [i], G_TYPE_OBJECT) && tmp->data.v_pointer != NULL) g_object_unref (tmp->data.v_pointer); else if (g_type_is_a (column_headers [i], G_TYPE_BOXED) && tmp->data.v_pointer != NULL) g_boxed_free (column_headers [i], (gpointer) tmp->data.v_pointer); g_slice_free (GtkTreeDataList, tmp); i++; tmp = next; } } Я вижу только удаление списка столбцов и заголовка. А Вы? anonymous (29.09.08 15:15:45 MSK) Показать ответ Ссылка
Ответ на: комментарий от anonymous 29.09.08 15:15:45 MSK GTK основан на GLib, вся аллокация и освобождение происходит именно там. Копай глубже ;) Deleted (29.09.08 21:26:40 MSK) Показать ответ Ссылка
Ответ на: комментарий от Deleted 29.09.08 21:26:40 MSK в смысле я хотел сказать, посмотри как именно происходит вставка и что должно в итоге освобождаться при удалении node из списка. на худой конец попробуй зациклить вставку 1 строки и ее удаление, потом посмотри на память. Deleted (29.09.08 21:34:11 MSK) Ссылка