我是一个使用GTK+和C编写一个小应用程序的初学者。我正在为GtkTreeView设置一个过滤器,显示功能如下,大部分是从here复制的。

static gboolean filter_func (GtkTreeModel *model, GtkTreeIter *row, gpointer data) {
  // if search string is empty return TRUE

  gchar *titleId, *region, *name;
  gtk_tree_model_get (model, row, 0, &titleId, 1, &region, 2, &name, -1);

  // get search string
  if (strstr (titleId, "search text here") != NULL) {
    return TRUE;
  }

  g_free (titleId);
  g_free (region);
  g_free (name);

  return FALSE;
}

到目前为止,我假设free()需要malloc(),阅读https://developer.gnome.org/glib/stable/glib-Memory-Allocation.html可以告诉我:
必须匹配g_malloc()(以及包装器,如g_new()
g_free()
如果是这样,为什么这里要调用g_free()?之所以如此重要,是因为在搜索中键入的每个字符将调用此代码数千次。

最佳答案

对。
the docs开始。
必须不引用G_type_OBJECT类型的返回值,必须释放G_type_STRING类型或G_type_BOXED类型的值。其他值按值传递。
G_TYPE_STRING是“与以nul结尾的C字符串相对应的基本类型”,即gchar
the docs中的“从GtkTreeModel读取数据”示例非常清楚。

   gchar *str_data;
   gint   int_data;

   // Make sure you terminate calls to gtk_tree_model_get() with a “-1” value
   gtk_tree_model_get (list_store, &iter,
                       STRING_COLUMN, &str_data,
                       INT_COLUMN, &int_data,
                       -1);

   // Do something with the data
   g_print ("Row %d: (%s,%d)\n",
            row_count, str_data, int_data);
   g_free (str_data);

如果是这样,为什么在这里调用g_free()?
因为gtk_tree_model_get是为你做的malloc。将函数内部分配的内存传递给调用者是a common use of a double pointer
str_data作为gtk_tree_model_get传递给g_char**以便它可以修改str_data点的位置。gtk_tree_model_get分配内存,获得g_char*。它将指针分配给*str_data以“返回”内存。然后以*str_data的形式访问字符串。
void get_tree_model_get_simplified(g_char** str_data)
{
    *str_data = g_malloc(...);
}

关于c - 声明gchar后需要g_free吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48613079/

10-11 22:59