2011-11-07 173 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