我是一个使用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()
?之所以如此重要,是因为在搜索中键入的每个字符将调用此代码数千次。 最佳答案
对。
从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/