我创建了简单的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
是否安全?或者我应该等待几秒钟?
或者在这种情况下是否还有其他机制来释放内存?
答案 0 :(得分:2)
GSignal发射是同步的,即信号的所有连接回调都由g_signal_emit()
按顺序运行,一旦所有回调返回,它将返回控制权。因此,在g_signal_emit()
返回后发出信号并释放信号的参数是安全的。
如果您正在使用DBus,那么它仍然是安全的:数据将被复制到接收进程,因为无法跨进程边界共享它。
答案 1 :(得分:0)
我对gdbus API并不熟悉,但通常对于这种用法,您希望让收件人负责释放存储空间。唯一的例外是当已知对象的生命周期超出收件人的需求(例如静态存储)或API处理为您复制数据时。