- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我是初学者,使用 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告诉我:
It's important to match
g_malloc()
(and wrappers such asg_new()
) withg_free()
如果是这样的话,为什么要在这里调用 g_free()
呢?这一点之所以重要,是因为在搜索中输入的每个字符都会调用此代码数千次。
最佳答案
来自 the docs .
Returned values with type G_TYPE_OBJECT have to be unreferenced, values with type G_TYPE_STRING or G_TYPE_BOXED have to be freed. Other values are passed by value.
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);
So if that is the case, then why is g_free() being called here?
因为 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(...);
}
关于c - 声明 gchar 后是否需要 g_free?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48613079/
我使用以下代码比较 gchar 中的字符串存储与从文件中读取的 char 数组: while (fgets(line, sizeof line, config) != NULL) { pr
我有一个包含字符串的字符数组: char buf[MAXBUFLEN]; buf[0] = 'f'; buf[1] = 'o'; buf[2] = 'o'; buf[3] = '\0'; 我希望将此字
所以,事情就是这样,我在这个上使用 GTK。 我正在请求 set_entry_text 上的名称。因此,用户输入他的名字,我将该变量保存为字符。 char *jugador1, *jugador2 /
我正在使用 g_strsplit 使用 \n 分隔符拆分 msg,并创建一个函数来断开字符串。该函数会中断 msg 并返回调用函数,因此我无法释放被调用函数中的拆分字符串指针。因此试图通过引用传递 g
当我尝试运行以下代码片段时,我不断收到此错误和奇怪的乱码: 错误是: (foo:11333):Pango-WARNING **:传递给 pango_layout_set_text() 的 UTF-8
当我按下键盘上的某个键(整数)时。它的作用类似于: gchar *keypressed; keypressed=gdk_keyval_name (event->keyval); printf("
我有一个定义如下的函数(用 C 语言): gchar **Scan_Return_File_Tag_Field_From_Mask_Code (File_Tag *FileTag, gchar cod
我似乎无法弄清楚我在这里做错了什么 我的结构: struct listItem {const gchar *name,*val1,*val2,*val3;}; 然后我会这样做: listItem *t
我正在尝试通过这段代码将 gchar 转换为 char const gchar * AddressText ; char * AddressValue = (char *) AddressText ;
我是初学者,使用 GTK+ 和 C 来编写一个小应用程序。我正在为 GtkTreeView 设置一个过滤器,显示功能如下,主要是从 here 复制的. static gboolean filter_f
我试图重构/修复一个函数,我是否正确地进行了截断?如果不是,一般应该怎么做?特别想知道潜在的泄漏。 void process_entry(GMenuTreeEntry *entry) { ch
在我的应用程序中我有结构: struct { gchar *xen_srv_addr; gchar *xen_srv_usr; gchar *xen_srv_psw; gchar *x
我目前正在学习 GTKTextTags和申请 GtkTextView和 GtkTextBuffer .我确实注意到了this question但不打算将我的数据导出到富文本文件,我认为这是问题的主要目
我有以下代码: int main() { const gchar *wew = gtk_entry_get_text(GTK_ENTRY(gtkentrywidget)); return 0; } g
在我的 main.h(包含在所有其他 src 文件中)中,我有: char* buffer; 这可以编译并正常工作。 由于某些其他原因,我尝试初始化buffer,两者都是 char* buffer="
我有一个字符串,其中包含一个整数值(的数字),我想以 int 形式获取该值。我知道还有其他方法可以做到这一点,例如 atoi();但是,我真的很想使用 glib 来做到这一点。是否存在这样的解析/转换
我正在开发一个用 C 编写的 linux 应用程序,它处理 gdk pixbuf 图像,然后应该通过 ftp (libcurl) 将它们发送到远程服务器。图像被保存到一个 gchar 缓冲区中 gdk
我正在为 gstreamer 构建一个 node.js 包装器。我能够构建和提取大量信息和对象(例如版本、插件、功能、上限和元素工厂。) 但是,当我调用 gst_element_factory_mak
我是一名优秀的程序员,十分优秀!