2017-05-18 10 views
-1

数日の間、私は自分のシステムでメモリリークを解決しようとしています。しかし、この1つのメモリリークが私を悩ませています。C - Valgrindがメモリリークを検出しましたが、それはありません

問題:Valgrindはメモリリークを報告している:

==28423== 10,988 (2,624 direct, 8,364 indirect) bytes in 82 blocks are definitely lost in loss record 405 of 409 
==28423== at 0x4C2FB55: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==28423== by 0x5553780: g_malloc0 (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4800.1) 
==28423== by 0x1B432E56: janus_audiobridge_create_user_secret (janus_audiobridge_room_helper.c:641) 
==28423== by 0x1B4250B3: janus_audiobridge_init (janus_audiobridge.c:281) 
==28423== by 0x4111BF: main (janus.c:3898) 

相続人janus_audiobridge_create_user_secret (janus_audiobridge_room_helper.c:641):

method_user_secret_error_case *janus_audiobridge_create_user_secret(PGconn *conn, janus_audiobridge_user_secret_model *user_secret_model, gboolean insert_in_db) { 
    JANUS_LOG(LOG_VERB, "Creating user_secret\n"); 

    /* Create the audio bridge secret */ 
    janus_audiobridge_user_secret *user_secret = g_malloc0(sizeof(janus_audiobridge_user_secret)); 
    method_user_secret_error_case *error = g_malloc0(sizeof(method_user_secret_error_case)); 
    if (user_secret_model->user_secret) { 
     user_secret->user_secret = g_strdup(user_secret_model->user_secret); 
    } else { 
     gchar *new_secret = randstring((size_t)100); 
     user_secret->user_secret = g_strdup(new_secret); 
     user_secret_model->user_secret = g_strdup(new_secret); // Model is necesarry for saving to database 
     g_free(new_secret); 
    } 
    user_secret->user_ip = g_strdup(user_secret_model->user_ip); 
    user_secret->created_at = user_secret_model->created_at; 
    if (insert_in_db) { 
     // Save to db 
     int save_err = janus_audiobridge_create_user_secret_db(conn, user_secret_model); 
     if (save_err == 0) { 
      JANUS_LOG(LOG_ERR, "Failed to save to database.\n"); 
      g_free(user_secret->user_secret); 
      g_free(user_secret->user_ip); 
      g_free(user_secret); 
      const gchar *error_message = "Error saving to database.\n"; 
      error->error = JANUS_AUDIOBRIDGE_ERROR_UNKNOWN_ERROR; 
      error->error_message = error_message; 
      return error; 
     } 
    } 

    g_hash_table_insert(user_secrets, g_strdup(user_secret->user_secret), user_secret); 
    // Prepare response 
    const gchar *error_message = ""; 
    error->error = 0; 
    error->error_message = error_message; 
    error->user_secret = user_secret; 

    return error; 
} 

そしてもちろんjanus_audiobridge_init (janus_audiobridge.c:281)の:

/* Fetch all user_secrets from database */ 
const gchar *select_all_user_secrets_query = "SELECT * FROM user_secrets;"; 
GHashTable *user_secrets_db = user_secrets_query(conn, select_all_user_secrets_query); 
// Create user secrets from database 
g_hash_table_iter_init(&iter, user_secrets_db); 
while (g_hash_table_iter_next(&iter, NULL, &value)) { 
    janus_audiobridge_user_secret_model *db_user_secret = value; 
    method_user_secret_error_case *create_resp = janus_audiobridge_create_user_secret(conn, db_user_secret, (gboolean)FALSE); 
    if (create_resp->error != 0) { 
     JANUS_LOG(LOG_ERR, "Error: %s\n", create_resp->error_message); 
    } 

    g_free(db_user_secret->user_secret); 
    g_free(db_user_secret->user_ip); 
    g_free(db_user_secret); 
    g_free(create_resp); 
} 
// Free the hashtable of entries from database 
g_hash_table_destroy(user_secrets_db); 

だから私の質問は以下の通りです:なぜvalgrindのショーをそれは私もメモリを漏らしているtho、私はg_でそれを解放しています無料ですか?他のuser_secret構造体はHashTableに格納されているので、後で使用するので解放できません。

P.私は自分のシステムの存続期間中一貫して使用するので、現時点ではコードのどこかでuser_secretを解放しません。

ありがとうございます!

EDIT: 申し訳ありませんが、私はそれがどのラインを提供するのを忘れ: 641行がある -

janus_audiobridge_user_secret *user_secret = g_malloc0(sizeof(janus_audiobridge_user_secret)); 

と281:

method_user_secret_error_case *create_resp = janus_audiobridge_create_user_secret(conn, db_user_secret, (gboolean)FALSE); 
+0

メモリは、ライン641をリークしている:誰かがそれは便利見つかった場合はここで

は、コードですか? –

+0

Valgrindは、標準ライブラリの代わりに独自のメモリ管理機能を提供することで動作します。したがって、メモリリークを識別することは非常に信頼できます。メモリがリークしていると言われる場合、考慮する必要がある唯一の結論は、メモリがリークしているということです。 –

+2

'g_malloc0()'呼び出しは641行目にありますか? – Attie

答えて

0

@SiggiSv、@nmと@Attieのおかげで

janus_destroyでユーザーの秘密を解放した後、valgrindはそのメモリリークの報告を停止しました。だから、バググリンドの仕組みがわからない私にはもっと問題でした。助けてくれた皆様に感謝しています。 - それは一つですcreate_user_secretに割り当てられた

// Free user secret memory - So Valgrind Doesn't register memory leak 
    // We do this, because we don't delete user secret in janus logic, and valgrind sees that as a memory leak 
    GHashTableIter iter; 
    gpointer value; 
    g_hash_table_iter_init(&iter, user_secrets); 
    while (g_hash_table_iter_next(&iter, NULL, &value)) { 
     janus_audiobridge_user_secret *user_secret = value; 
     g_free(user_secret->user_secret); 
     g_free(user_secret->user_ip); 
     g_free(user_secret); 
    } 
    g_hash_table_destroy(user_secrets); 
関連する問題