【问题标题】:DBUS Server CrashingDBUS 服务器崩溃
【发布时间】:2011-11-07 21:16:18
【问题描述】:

我正在使用 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,所以我可能缺少一些明显的东西。我一直在阅读this tutorial,并且大多数示例都有效。不幸的是,它没有将数组返回给客户端的示例。

【问题讨论】:

  • 看起来@Mike 是正确的。您创建一个新的内存区域并获得一个地址。您需要以某种方式将该地址传递回被调用方。答案是指向指针的指针。

标签: c linux glib dbus systems-programming


【解决方案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;
}

【讨论】:

  • 好收获。我是怎么错过的。
猜你喜欢
  • 2016-06-12
  • 2017-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-10
  • 2016-01-22
相关资源
最近更新 更多