Сбой сервера DBUS

Я реализую объект DBUS с привязками Glib, и у меня возникают проблемы с возвратом GArrays:

gboolean TestObject_get_data(TestObject* obj, GArray* buffer, GError** error)
{
    int i;

    printf("%s Entering\n", __PRETTY_FUNCTION__);

    buffer = g_array_new(FALSE, FALSE, sizeof(char));

    if(buffer)
    {
        for(i = 0; i < 5 ; i++)
        {
            g_array_append_val(buffer, i);
        }
        return TRUE;
    }

    /* TODO: Error handling */

    return FALSE;
}

Когда я вызываю метод объекта с помощью тестового клиента, я получаю ошибку сегментации:

waffleman@thegriddle$ ./testObject 
TestObject_get_data Entering

** ERROR **: out of memory
aborting...
Aborted (core dumped)

Программа вылетает после возврата из функции. Это первый раз, когда я использую Glib, поэтому может быть что-то очевидное, что я упускаю. Я прочитал это руководство, и большинство примеров работает. К сожалению, у него нет примера возврата массива клиенту.


person waffleman    schedule 07.11.2011    source источник
comment
Похоже, @Mike прав. Вы создаете новую область памяти и получаете адрес. Вам нужно каким-то образом передать этот адрес обратно вызываемому. Ответ - указатель на указатель.   -  person Earlz    schedule 08.11.2011


Ответы (1)


Если вы хотите выделить массив внутри своей функции, вам нужно передать ссылку. Ваша текущая функция пропускает память, так как вы назначаете локальную переменную при создании массива.

gboolean TestObject_get_data(TestObject *obj, GArray **buffer, GError **error)
{
    if (buffer) {
        *buffer = g_array_new(FALSE, FALSE, sizeof(char));
        if (*buffer) {
            int i;
            for (i = 0; i < 5 ; ++i) {
                g_array_append_val(*buffer, i);
            }
            return TRUE;
        }
    }
    return FALSE;
}
person Mike Steinert    schedule 07.11.2011
comment
Хороший улов. Как-то я это пропустил. - person waffleman; 08.11.2011