0

我希望有人可以帮助我找出让我发疯的内存泄漏。通过多轮故障排除,我将问题缩小到一个特定功能的一个特定部分,该部分根据传入的网络消息更新 GTK 标签。只要程序正在运行,此功能就会每 200 毫秒在计时器上重复一次。如果没有传入的网络消息或没有与我要查找的消息匹配的传入消息,则没有问题。但是当我开始发送匹配的消息并触发 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 中的一个问题,有没有办法解决它?

提前致谢!

4

2 回答 2

1

您的使用gtk_label_set_text()似乎很好。

乍一看,这与您的描述不完全相符,但我注意到您从来没有 free incoming_message,因此每次收到消息时都会泄漏。也许没有与您的条件不匹配的非零大小的消息?

于 2012-05-31T04:57:17.550 回答
1

您的代码存在一些问题:

  1. 如果您不关心错误处理,请使用NULL代替err;
  2. if erris NULL,它不能是g_error_free'd: 实际上它恰好可以工作,但不要指望它;
  3. 如果buffer对您的函数是本地的,只需使用本地数组:它将避免g_free()在每个退出点上;
  4. return FALSE永远达不到;

我会这样重写它:

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

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

于 2012-06-01T13:38:58.153 回答