我希望有人可以帮助我找出让我发疯的内存泄漏。通过多轮故障排除,我将问题缩小到一个特定功能的一个特定部分,该部分根据传入的网络消息更新 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 中的一个问题,有没有办法解决它?
提前致谢!