【问题标题】:is g_free needed after declaring gchar?声明gchar后是否需要g_free?
【发布时间】:2018-02-04 21:14:44
【问题描述】:

我是使用 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;
}

到目前为止,我假设malloc() 需要free(),阅读https://developer.gnome.org/glib/stable/glib-Memory-Allocation.html 告诉我:

匹配g_malloc()(以及g_new()等包装器)很重要 g_free()

如果是这样,那么为什么在这里调用g_free()?这很重要的原因是因为在搜索中键入的每个字符都会调用此代码数千次。

【问题讨论】:

  • 您没有正确复制。在您链接的文本中,g_free 也会被调用,以防返回 TRUE。如果满足条件,您的代码会产生内存泄漏。
  • @Gerhardh 对,谢谢。
  • 因为gtk_tree_model_get正在调用g_malloc

标签: c malloc gtk3 free


【解决方案1】:

是的。

来自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 作为g_char** 传递给gtk_tree_model_get,因此它可以修改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(...);
}

【讨论】:

    【解决方案2】:

    那里的指针被释放,因为gtk_tree_model_get mallocs 指针指向字符串并将提供的指针设置为指向这些字符串。 function reference

    注意它说“需要释放G_TYPE_STRING 类型的值”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多