1

我创建了简单的 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或者我应该等待几秒钟?或者在这种情况下还有其他释放内存的机制吗?

4

2 回答 2

2

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

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

于 2014-02-03T11:44:58.260 回答
0

我特别不熟悉 gdbus API,但一般来说,对于这种用法,您希望让接收者有责任释放存储空间。唯一的例外是当已知对象的生命周期超出接收者的需求(例如静态存储)或 API 为您处理复制数据时。

于 2014-02-03T04:25:19.393 回答