Я надеюсь, что кто-то может помочь мне разобраться в утечке памяти, которая сводит меня с ума. Через различные раунды устранения неполадок я сузил проблему до одного конкретного раздела одной конкретной функции, которая обновляет метку GTK на основе входящего сетевого сообщения. Эта функция повторяется на таймере каждые 200 мс, пока программа работает. Если нет входящих сетевых сообщений или нет входящих сообщений, которые соответствуют тем, которые я ищу, проблем нет. Но когда я начинаю отправлять сообщения, которые соответствуют, вызывая вызов gtk_label_set_text, я начинаю видеть медленную утечку памяти. Пока совпадают сообщения, память падает ровно на 60 к каждые 30-60 секунд. Если я перестаю отправлять соответствующие сообщения, утечка немедленно прекратится.Утечка памяти из gtk_label_set_text
Вот моя функция:
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 в нем принимает значение TRUE.
Надеясь, что кто-то скажет мне, где я ошибаюсь, или если это на самом деле проблема в GTK, есть ли способ обойти это?
Заранее благодарен!
Спасибо, сегодня я попробую попробовать. Но если утечки здесь нет, я не знаю, где еще это может быть, поскольку, похоже, он уходит, когда я прокомментирую вызов этой функции. Может ли быть где-то в создании GSocket listenSocket? Если бы это было так, я бы подумал, что утечка по-прежнему будет возникать, когда появятся входящие сообщения независимо от того, вызвал ли я g_socket_receive ... – DrRocket
Помимо 'g_error_free', ваш код не имеет очевидных ошибок. Мое предположение: 1. у вас нет утечек (то есть, вы проверяете наличие утечек, ошибочны); 2. Вы передаете текст без utf8 в gtk_label_set_text() (не показано в приведенном выше коде); 3. утечка находится где-то в другом месте. – ntd
Addenum: Я только что проверил, что ваш предыдущий код эффективно протекал 'incoming_message'. – ntd