Использование `g_object_set_data` для передачи имени пользователя - PullRequest
0 голосов
/ 04 мая 2010

Я использую g_object_set_data, чтобы установить имя пользователя с помощью event_box, поэтому при обратном вызове я могу получить его с помощью указателя на event_box.

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

но проблема в том, что я задаю имя_пользователя, которое не является строкой, выделенной указателем.
Это локальная строка (не размещенная на бедре), которая уничтожается.

Так что необходимо выделить и затем использовать указатель, я просто хочу связать одно имя с этим event_box.

Ответы [ 2 ]

6 голосов
/ 04 мая 2010

Используйте следующий код:

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

Таким образом, строка будет дублироваться в куче, и копия будет автоматически освобождена при уничтожении event_box.

2 голосов
/ 04 мая 2010

Да, поскольку данные, хранящиеся в GObject, являются простым указателем, он не может выполнять управление памятью за вас.

Просто вызовите <a href="http://library.gnome.org/devel/glib/stable/glib-String-Utility-Functions.html#g-strdup" rel="nofollow noreferrer">g_strdup()</a> в строке и сохраните результат.

...