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 に答える