声明gchar后需要g_free吗?

时间:2018-02-04 21:14:45

标签: c malloc gtk3 free

我是初学者,使用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()?这很重要的原因是因为在搜索中键入的每个字符将调用此代码数千次。

2 个答案:

答案 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(...);
}