微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 GLIB 和 C 代码更正读取的 INI 文件?

如何解决如何使用 GLIB 和 C 代码更正读取的 INI 文件?

我正在尝试正确使用 GLIB 来读取 ini 文件,但我仍然出现内存泄漏,特别是在其中一个函数中。 我创建了一些自定义函数读取字符串、int、int64 和浮点数。我的代码正在运行,除了我从 int64 版本中获取内存泄漏。另外,在其他功能中,我得到了“Still Reachable”记录。我知道第二种情况不是真正的问题,它本身不是内存泄漏。但我想知道是否有任何方法可以使这更好并清除那些可访问的记录。

关于“有问题”的功能,就是这个:

long ini_getinteger64(char *ini_file,char *section,char *key,long def_value) {
    GKeyFile *localini;
    GError *error = NULL;
    long abc = 0;

    localini = g_key_file_new();

    if (g_key_file_load_from_file(localini,ini_file,G_KEY_FILE_KEEP_COMMENTS,&error) == FALSE) {
        mylog_log("Error loading ini file.\n");
        g_key_file_free(localini);
        if (error != NULL) {
            g_error_free(error);
        }
        return def_value;
    }

    abc = g_key_file_get_int64(localini,section,key,&error);    
    g_key_file_free(localini);

    if (error != NULL) {        
        if (error->code == G_KEY_FILE_ERROR_KEY_NOT_FOUND || error->code == G_KEY_FILE_ERROR_INVALID_VALUE || error->code == G_KEY_FILE_ERROR_GROUP_NOT_FOUND) {
            g_error_free(error);
            return def_value;
        } else {
            g_error_free(error);
            return abc;
        }
    } else {
        return abc;
    }


}

这就是我的称呼:

long total_packets = ini_getinteger64(f_file,"stats","total_packets",0);

这是该函数的 valgrind 报告的一部分:

==15486== 184 (88 direct,96 indirect) bytes in 1 blocks are definitely lost in loss record 70 of 87
==15486==    at 0x6CA177F: malloc (vg_replace_malloc.c:299)
==15486==    by 0x72EB8D0: g_malloc (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.5800.3)
==15486==    by 0x7303832: g_slice_alloc (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.5800.3)
==15486==    by 0x72D3D2D: g_hash_table_new_full (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.5800.3)
==15486==    by 0x72BFCF0: g_get_language_names_with_category (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.5800.3)
==15486==    by 0x72DB58B: ??? (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.5800.3)
==15486==    by 0x72DD22C: g_key_file_new (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.5800.3)
==15486==    by 0x11AFAC: ini_getinteger64 (utils.c:493)
==15486==    by 0x11962C: updateClientStats (user_stats.c:623)
==15486==    by 0x1122E2: proccess_packet (proc_packets.c:55)
==15486==    by 0x111C4C: receive_client_data (net_server.c:524)
==15486==    by 0x1107E0: thread_waitNewClients (net_server.c:175)

我不确定我做错了什么。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。