我是初学者,使用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, ®ion, 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()
?这很重要的原因是因为在搜索中键入的每个字符将调用此代码数千次。
答案 0 :(得分:4)
指针释放,因为gtk_tree_model_get
mallocs指向字符串指针并设置指向这些字符串的指针。 function reference
注意它所说的"需要释放类型为G_TYPE_STRING
的值"
答案 1 :(得分:4)
来自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(...);
}