2011-11-07 9 views
1

私は口が達者バインディングとDBUSオブジェクトを実装していますし、戻っGArraysに問題が午前:DBUSサーバーをクラッシュ

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; 
} 

私はテストクライアントでオブジェクトのメソッドを呼び出すと、私はセグメンテーションフォールトを取得:

[email protected]$ ./testObject 
TestObject_get_data Entering 

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

関数が戻ると、プログラムがクラッシュします。私がGlibを​​初めて使用したのは今回が初めてですので、私が紛失していることが明らかになっているかもしれません。私はthis tutorialを読んでおり、ほとんどの例が機能しています。残念ながら、配列をクライアントに返す例はありません。

+0

@Mikeは正しいと思われます。新しいメモリ領域を作成してアドレスを取得します。あなたはどういうわけかそのアドレスを呼び出し先に返す必要があります。答えはポインタへのポインタです。 – Earlz

答えて

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; 
} 
+0

良いキャッチ。どのように私はそれを逃した。 – waffleman

関連する問題