-1

私はg_object_set_dataevent_box でユーザー名を設定するために使用しているので、コールバックで event_box ポインターで取得できます。

g_object_set_data(G_OBJECT(event_box), "user_name", (gpointer)(user_name) );

しかし、問題は、ポインターに割り当てられた文字列ではない user_name を設定していることです。
破棄されるのはローカル文字列 (ヒップに割り当てられていない) です。

そのため、ポインタを割り当ててから使用する必要があります。この event_box に 1 つの名前を関連付けたいだけです。

4

2 に答える 2

6

次のコードを使用します。

g_object_set_data_full (G_OBJECT (event_box),
                        "user_name",
                        g_strdup (user_name),
                        (GDestroyNotify) g_free);

event_boxこのようにして、文字列がヒープ上に複製され、コピーが破棄されると自動的に解放されます。

于 2010-05-04T13:14:16.677 に答える
2

はい、GObjectに保存されているデータは単なるポインタであるため、メモリ管理を行うことはできません。

文字列を呼び出しg_strdup()て、結果を保存するだけです。

于 2010-05-04T11:55:50.257 に答える