C-Valgrind发现内存泄漏,但它不应该

C-Valgrind发现内存泄漏,但它不应该,c,memory-leaks,C,Memory Leaks,几天来,我一直在努力清理系统中的内存泄漏。但这一次内存泄漏一直困扰着我 method_user_secret_error_case *create_resp = janus_audiobridge_create_user_secret(conn, db_user_secret, (gboolean)FALSE); 问题:Valgrind报告内存泄漏: ==28423== 10,988 (2,624 direct, 8,364 indirect) bytes in 82 blocks are d

几天来,我一直在努力清理系统中的内存泄漏。但这一次内存泄漏一直困扰着我

method_user_secret_error_case *create_resp = janus_audiobridge_create_user_secret(conn, db_user_secret, (gboolean)FALSE);
问题: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)
method_user_secret_error_case *create_resp = janus_audiobridge_create_user_secret(conn, db_user_secret, (gboolean)FALSE);
这里是janus\u audiobridge\u创建用户秘密(janus\u audiobridge\u room\u helper.c:641):

method_user_secret_error_case *create_resp = janus_audiobridge_create_user_secret(conn, db_user_secret, (gboolean)FALSE);
当然还有
janus\u audiobridge\u init(janus\u audiobridge.c:281)

method_user_secret_error_case *create_resp = janus_audiobridge_create_user_secret(conn, db_user_secret, (gboolean)FALSE);
所以我的问题是:为什么valgrind显示我正在泄漏内存,即使我用g_free释放它?另一个
user\u secret
struct存储在HashTable中,因此我无法释放它,因为我稍后会使用它

method_user_secret_error_case *create_resp = janus_audiobridge_create_user_secret(conn, db_user_secret, (gboolean)FALSE);
另外,我现在不会在代码的任何地方释放user_secret,因为我在系统的生命周期中始终使用它

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

method_user_secret_error_case *create_resp = janus_audiobridge_create_user_secret(conn, db_user_secret, (gboolean)FALSE);
编辑: 对不起,我忘了提供哪一行: 641行是-

janus_audiobridge_user_secret *user_secret = g_malloc0(sizeof(janus_audiobridge_user_secret));
method_user_secret_error_case *create_resp = janus_audiobridge_create_user_secret(conn, db_user_secret, (gboolean)FALSE);
和281:

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

感谢@SiggiSv、@n.m和@Attie

method_user_secret_error_case *create_resp = janus_audiobridge_create_user_secret(conn, db_user_secret, (gboolean)FALSE);
在释放janus_destroy上的用户机密后,valgrind停止报告内存泄漏。因此,我不知道valgrind是如何工作的,这是一个更大的问题。再次感谢所有帮助过我的人

method_user_secret_error_case *create_resp = janus_audiobridge_create_user_secret(conn, db_user_secret, (gboolean)FALSE);
下面是代码,如果有人发现它有用:

method_user_secret_error_case *create_resp = janus_audiobridge_create_user_secret(conn, db_user_secret, (gboolean)FALSE);
  // 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);

create_user_secret中分配的内存正在泄漏,第641行-是哪一行?Valgrind通过提供自己的内存管理功能来代替标准库。因此,对于识别内存泄漏是非常可靠的:如果它说你正在泄露内存,那么你应该考虑的唯一结论是泄漏内存。哪个代码> GyMalLoC0](< /代码>调用在第641行?@ ATTII更新了我的PASTI认为你已经发现(一些)泄露的对象。目前尚不清楚您是否找到了正确的泄漏修复方法。