【问题标题】:gdbus: is it safe to free signal argument right after signal emissiongdbus:在信号发射后立即释放信号参数是否安全
【发布时间】:2014-02-03 03:14:07
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c glib gdbus


    【解决方案1】:

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

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

    【讨论】:

    • 我需要在接收器中释放这些数据吗?
    • 这完全取决于您在接收器中使用的 API。
    • 通常情况下,让接收者释放使用 g_signal_emit 发送的数据是个坏主意,因为可能有多个;最好在发送方处理。
    【解决方案2】:

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

    【讨论】:

    • 好吧,(正如我上面所说)您可以将任意数量的接收器连接到信号,并且您只需要释放一次存储空间......所以最好在 g_signal_emit 返回之后再做。
    猜你喜欢
    • 2014-03-27
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多