0

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

前もって感謝します!

4

2 に答える 2

1

の使用はgtk_label_set_text()問題ないようです。

これは一見あなたの説明と完全には一致しませんが、あなたが解放することは決してないincoming_messageので、メッセージを受信するたびにリークすることに注意してください。おそらく、あなたの条件に一致しないゼロ以外のサイズのメッセージはありませんか

于 2012-05-31T04:57:17.550 に答える
1

あなたのコードにはいくつかの問題があります:

  1. エラー処理を気にしない場合は、NULL代わりにerr;を使用してください。
  2. である場合、'd であってerrNULLなりませんg_error_free。実際には、たまたま機能しますが、当てにしないでください。
  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 に答える