誰かが私を夢中にさせているメモリリークを見つけ出すのを手伝ってくれることを願っています. さまざまなトラブルシューティングを通じて、受信ネットワーク メッセージに基づいて 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 の問題である場合、それを回避する方法はありますか?
前もって感謝します!