1

Glibバインディングを使用してDBUSオブジェクトを実装していますが、GArrayを返す際に問題が発生します。

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を​​使用したのはこれが初めてなので、私が見逃していることが明らかなことがあるかもしれません。私はこのチュートリアルを読んでいますが、ほとんどの例が機能します。残念ながら、配列をクライアントに返す例はありません。

4

1 に答える 1

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;
}
于 2011-11-07T21:56:57.913 に答える