来自gtk_label_set_text的内存泄漏

时间:2012-05-31 04:48:46

标签: c gtk

我希望有人可以帮助我找出让我疯狂的内存泄漏。通过各种故障排除,我将问题缩小到一个特定功能的一个特定部分,该功能根据传入的网络消息更新GTK标签。只要程序正在运行,该功能每200ms就会重复一次。如果没有传入的网络消息或没有与我正在寻找的消息匹配的传入消息,则没有问题。但是当我开始发送匹配的消息时,触发gtk_label_set_text调用,我开始看到缓慢的内存泄漏。只要匹配消息不断进入,内存每30-60秒就会下降60k。如果我停止发送匹配的消息,泄漏会立即停止。

这是我的功能:

static gboolean get_incoming_message()
{

gchar *buffer = g_malloc(1024);
gssize incoming_size;
GError *err = NULL;

incoming_size = g_socket_receive(listenSocket, (gchar *)buffer, 1024, NULL, &err);


if ( incoming_size > 0 )
{
    gchar *incoming_message = g_strndup ((const gchar *)buffer, incoming_size);

    if ((g_strcmp0(incoming_message, "Show 1 in Progress")==0) || (g_strcmp0(incoming_message, "Show 2 in Progress")==0))
    {

        gtk_label_set_text (GTK_LABEL (current_status_message_box), (const gchar *)incoming_message);
    }

    g_free(incoming_message);
    g_free(buffer);
    g_error_free(err);
    return TRUE;
}
else
{
    g_free(buffer);
    g_error_free(err);
    return TRUE;
}

return FALSE;

}

同样,只有当其中包含g_strcmp0的if语句的计算结果为TRUE时才会发生泄漏。

希望有人可以告诉我哪里出错了,或者这是否真的是GTK的问题还有办法吗?

提前致谢!

2 个答案:

答案 0 :(得分:1)

您使用gtk_label_set_text()似乎没问题。

乍一看,这与您的说明并不完全一致,但我注意到您永远不会释放incoming_message,因此每次收到邮件时都会泄漏。也许 没有非零大小的消息与您的条件不匹配?

答案 1 :(得分:1)

您的代码遇到了一些问题:

  1. 如果您不关心错误处理,请使用NULL代替err;
  2. 如果errNULL,则不得为g_error_free d:实际上它恰好在工作但不依赖它;
  3. 如果buffer对于您的函数是本地的,只需使用本地数组:它将避免每个出口点上的g_free();
  4. return FALSE永远不会到达;
  5. 我会这样重写:

    static gboolean get_incoming_message()
    {   
        gchar buffer[1024];
        gssize incoming_size;
    
        incoming_size = g_socket_receive(listenSocket, buffer, 1024, NULL, NULL);
        if (incoming_size < 0)
            return FALSE;
    
        if (incoming_size > 0 &&
            (strncmp(buffer, "Show 1 in Progress", 1024) == 0 ||
             strncmp(buffer, "Show 2 in Progress", 1024) == 0))
            gtk_label_set_text(GTK_LABEL(current_status_message_box), buffer);
    
        return TRUE;
    }
    

    除此之外,您发布的代码中没有泄漏。