LINUX.ORG.RU

gtk_list_store_clear()


0

0

Освобождается ли память из под элементов, хранящихся в GtkListStore* при вызове gtk_list_store_clear() ? Спасибо.

anonymous

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

О! Поведайте-ка нам как узнать ответ по вопросу о 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
()
Ответ на: комментарий от Deleted

в смысле я хотел сказать, посмотри как именно происходит вставка и что должно в итоге освобождаться при удалении node из списка.

на худой конец попробуй зациклить вставку 1 строки и ее удаление, потом посмотри на память.

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