g_variant_get

发布时间 2023-04-10 13:32:42作者: lydstory

与标准C的null结尾的字符串进行转换。当遇到's','o','g'格式化字符串时,g_variant_new()获取(const gchar* )并且进行拷贝。NULL是一个无效的字符串;如果是'o'和'g'字符被使用,必须注意确保传递的字符串分别是有效的D-Bus对象路径或D-Bus类型签名。

当遇到's','o','g'格式化字符串时,g_variant_get()首先创建一块新的内存,然后把要返回的字符串拷贝到这个内存中,然后将这块内存返回给一个指向(gchar *)的指针,所以g_variant_get()要传入一个(gchar **)类型的参数。所以这个获取到的字符串需要使用g_free()进行释放。

GVariant *value1, *value2, *value3;

value1 = g_variant_new ("s", "hello world!");
value2 = g_variant_new ("o", "/must/be/a/valid/path");
value3 = g_variant_new ("g", "iias");

#if 0
g_variant_new ("s", NULL); /* not valid: NULL is not a string. */
#endif

{
gchar *result;

g_variant_get (value1, "s", &result);
g_print ("It was '%s'\n", result);
//这里一定要进行内存释放,不然会产生内存泄漏,这也是和下面要说的‘&s’的主要区别
g_free (result);
}
 
18.


Pointers

Characters: ​​&​​

'&'字符用来指示序列化的数据(也就是variant的值)应该通过指针直接交换。目前,这个字符的唯一用途是当它被应用到字符串(例如:'&s', '&o'或'&g')。对于g_variant_new(),这完全没有效果。

对于g_variant_get(),它意味着返回一个指向序列化数据的指针,而不是创建一个新分配的字符串副本。这个指针不应该被释放。执行有效性检查以确保字符串数据将始终正确地以null结束。

所以"&s"和"s"主要区别就在g_variant_get()获取这一块,"&s"获取的字符串是variant内部的数据。而"s"是先分配一块内存,然后将varient的内部数据拷贝到新分配的内存中,所以通过"s"获取的字串,使用完毕后需要进行释放。而“&s”获取的字符串不需要进行释放。

登录后复制
{
const gchar *str;
GVariant *value;

value = g_variant_new ("&s", "hello world");
g_variant_get (value, "&s", &str);
g_print ("string is: %s\n", str);
/* no need to free str */
}
v
https://blog.51cto.com/u_11626714/4880943