gdbus:在信号发射后立即释放信号参数是安全的

时间:2014-02-03 03:14:07

标签: c glib gdbus

我创建了简单的dbus服务,它使用动态分配的数据参数发出信号:

file_name = g_strdup("myfile");
...
...
g_signal_emit_by_name (object, "mysignal", file_name);
g_free(file_name);

在这种情况下,信号侦听器可能会收到已被销毁的file_name字符串。

file_name通话后立即免费g_signal_emit_by_name是否安全?或者我应该等待几秒钟? 或者在这种情况下是否还有其他机制来释放内存?

2 个答案:

答案 0 :(得分:2)

GSignal发射是同步的,即信号的所有连接回调都由g_signal_emit()按顺序运行,一旦所有回调返回,它将返回控制权。因此,在g_signal_emit()返回后发出信号并释放信号的参数是安全的。

如果您正在使用DBus,那么它仍然是安全的:数据将被复制到接收进程,因为无法跨进程边界共享它。

答案 1 :(得分:0)

我对gdbus API并不熟悉,但通常对于这种用法,您希望让收件人负责释放存储空间。唯一的例外是当已知对象的生命周期超出收件人的需求(例如静态存储)或API处理为您复制数据时。