g_clear_error和g_error_free
时间: 2023-08-16 07:04:42 浏览: 60
g_clear_error和g_error_free都是GLib库提供的用于处理错误的函数。
函数g_clear_error用于清除错误信息,其原型如下:
```c
void g_clear_error(GError **error);
```
其中,参数error是一个指向GError指针的指针。如果该指针不为NULL,则会释放该指针指向的错误信息并将指针置为NULL。
函数g_error_free用于释放错误信息,其原型如下:
```c
void g_error_free(GError *error);
```
其中,参数error是一个指向GError指针的指针。如果该指针不为NULL,则会释放该指针指向的错误信息。
通常情况下,我们在使用GLib库中的函数时,如果函数返回了一个错误信息,我们需要先判断该指针是否为NULL,如果不为NULL,则需要先进行错误处理,比如打印错误信息、清除错误信息等。使用g_clear_error和g_error_free可以方便地处理错误信息,避免内存泄漏和错误信息重复输出等问题。
相关问题
分析下面一段代码 Context context = { 0 }; if (argc < 3) { g_printerr ("error: missing arguments\n"); g_printerr ("usage: %s <NUMBER> <TEXT>\n", argv[0]); exit (EXIT_FAILURE); } context.properties = mm_sms_properties_new (); mm_sms_properties_set_number (context.properties, argv[1]); mm_sms_properties_set_text (context.properties, argv[2]); g_bus_get (G_BUS_TYPE_SYSTEM, NULL, (GAsyncReadyCallback) bus_get_ready, &context); context.loop = g_main_loop_new (NULL, FALSE); g_main_loop_run (context.loop); g_assert (!context.current_obj); g_assert (!context.current_messaging); g_assert (!context.current_sms); g_main_loop_unref (context.loop); g_clear_object (&context.connection); g_clear_object (&context.manager); g_clear_object (&context.properties); g_list_free_full (g_steal_pointer (&context.objects), g_object_unref); return 0; }
这段代码是一个使用 Glib 库编写的程序,主要是发送短信的功能。首先定义了一个结构体 Context,然后对其进行初始化。接着判断命令行参数个数是否符合要求,如果不符合则输出错误信息并退出程序。如果参数个数正确,则创建一个短信属性对象并设置短信号码和短信内容。接下来通过 g_bus_get 函数获取一个 D-Bus 连接,并异步调用 bus_get_ready 函数进行处理,同时将 context 作为参数传递给 bus_get_ready 函数。然后创建一个主循环,并运行它。程序中使用了一些断言来确保 context 结构体中的一些成员变量没有被设置,防止出现错误。最后释放相关资源并退出程序。
在调用g_socket_condition_wait时,socket关闭时,该函数会退出吗
在调用 g_socket_condition_wait 函数时,如果与条件变量相关的 socket 被关闭,该函数会自动返回并返回一个错误值。具体来说,会返回 G_IO_ERROR_CLOSED 错误码,表示 socket 已关闭。
下面是一个示例代码:
```c
GSocketCondition condition = G_SOCKET_CONDITION_IS_READABLE;
GError *error = NULL;
while (TRUE) {
if (g_socket_condition_wait(socket, condition, NULL, &error) == -1) {
if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CLOSED)) {
// socket已关闭,退出循环
g_clear_error(&error);
break;
}
// 其他错误,处理错误并退出循环
g_print("g_socket_condition_wait error: %s\n", error->message);
g_error_free(error);
break;
}
// 执行相应的操作
...
}
```
在上面的代码中,如果调用 g_socket_condition_wait 函数时与条件变量相关的 socket 被关闭了,该函数会返回 -1,并设置一个错误对象。通过判断该错误对象的类型,可以判断 socket 是否已关闭,如果是则退出循环。否则,需要处理其他错误并退出循环。