在glib中使用垃圾回收时发生内存泄漏

马歇尔

我试图在Linux中将Boehm垃圾收集器与GLib集成在一起,但是在一种情况下,我发现它没有释放内存:当我多次调用g_strsplit时,它将耗尽内存并出现段错误。垃圾收集器的自述文件警告说,它可能无法在动态库中找到指针,并且可能需要使用GC_add_roots。

为了测试这一点,我将所有相关代码从GLib复制到了我的源文件中,完全没有针对libglib-2.0.so进行链接。这消除了段错误,这告诉我这确实是问题所在。但是,没有有关如何使用GC_add_roots解决此问题的文档。有人能帮我吗?

这是导致内存泄漏的代码:

#include <glib.h>
#include <gc.h>

void no_free(void *mem) {}

int main() {
    g_mem_gc_friendly = TRUE;

    GMemVTable memvtable = {
        .malloc      = GC_malloc,
        .realloc     = GC_realloc,
        .free        = no_free,
        .calloc      = NULL,
        .try_malloc  = NULL,
        .try_realloc = NULL
    };

    g_mem_set_vtable(&memvtable);

    for (int i = 0; i < 10000; i++) {
        char **argv = g_strsplit("blah", " ", 0);
        argv[0][0] = 'a'; // avoid unused variable warning
    }

    return 0;
}
菲利普·威纳尔

由于GLib 2.46g_mem_set_vtable()不执行任何操作,因此无法使用现代GLib在GLib级别上使此工作正常进行。GLib现在在调用g_malloc()g_new()时无条件地使用libc中GSLice分配器。当您显式使用时g_slice_*()GLib仍使用自己的分配器,但是它也向libc分配器请求其块分配。

我建议您尝试在libc级别集成垃圾收集器。一篇关于使用glibc的malloc钩子实现该方法的老文章,该钩子与基本上相同GMemVTable,但是在glibc级别而不是GLib级别。我没有尝试过,所以我不知道它在实践中的效果如何。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Java垃圾回收:数组发生内存泄漏(使用OpenCV)

来自分类Dev

Glib:创建GDBusProxy时发生内存泄漏

来自分类Dev

在IOS中使用Web服务时,发生NSURLSession内存泄漏

来自分类Dev

在Node.js中使用流时发生内存泄漏?

来自分类Dev

在python中使用pickle时发生内存泄漏

来自分类Dev

使用NodeJS时发生内存泄漏

来自分类Dev

使用实体框架时发生内存泄漏

来自分类Dev

使用MBProgressHUD时发生内存泄漏

来自分类Dev

循环使用NSReadPixel时发生内存泄漏

来自分类Dev

使用DnsGetCacheDataTable时发生内存泄漏

来自分类Dev

在动态软件包库中使用TTask时发生内存泄漏

来自分类Dev

JavaScript内存泄漏-DOM节点和后代上的垃圾回收

来自分类Dev

Android内存的性质因方向更改和垃圾回收而泄漏

来自分类Dev

内存泄漏?!在“ array_map”中使用“ create_function”时,垃圾收集器是否正确?

来自分类Dev

在C#中使用Powershell远程调用发生内存泄漏

来自分类Dev

使用Delphi的引用计数功能时发生内存泄漏

来自分类Dev

在Windows上使用包XML时发生内存泄漏

来自分类Dev

在Windows上使用包XML时发生内存泄漏

来自分类Dev

使用智能指针时发生内存泄漏

来自分类Dev

使用activesocket重复连接/断开时发生内存泄漏

来自分类Dev

使用regex.h时发生内存泄漏?

来自分类Dev

使用AutomationElement类时可能发生内存泄漏

来自分类Dev

使用SinkWriter(Media Foundation)C时发生内存泄漏

来自分类Dev

在Windows上使用包XML时发生内存泄漏

来自分类Dev

使用regex.h时发生内存泄漏?

来自分类Dev

使用shared_ptr时发生内存泄漏

来自分类Dev

过多的垃圾回收(和内存使用?)

来自分类Dev

不了解内存使用/垃圾回收

来自分类Dev

使用matplotlib发生内存泄漏

Related 相关文章

  1. 1

    Java垃圾回收:数组发生内存泄漏(使用OpenCV)

  2. 2

    Glib:创建GDBusProxy时发生内存泄漏

  3. 3

    在IOS中使用Web服务时,发生NSURLSession内存泄漏

  4. 4

    在Node.js中使用流时发生内存泄漏?

  5. 5

    在python中使用pickle时发生内存泄漏

  6. 6

    使用NodeJS时发生内存泄漏

  7. 7

    使用实体框架时发生内存泄漏

  8. 8

    使用MBProgressHUD时发生内存泄漏

  9. 9

    循环使用NSReadPixel时发生内存泄漏

  10. 10

    使用DnsGetCacheDataTable时发生内存泄漏

  11. 11

    在动态软件包库中使用TTask时发生内存泄漏

  12. 12

    JavaScript内存泄漏-DOM节点和后代上的垃圾回收

  13. 13

    Android内存的性质因方向更改和垃圾回收而泄漏

  14. 14

    内存泄漏?!在“ array_map”中使用“ create_function”时,垃圾收集器是否正确?

  15. 15

    在C#中使用Powershell远程调用发生内存泄漏

  16. 16

    使用Delphi的引用计数功能时发生内存泄漏

  17. 17

    在Windows上使用包XML时发生内存泄漏

  18. 18

    在Windows上使用包XML时发生内存泄漏

  19. 19

    使用智能指针时发生内存泄漏

  20. 20

    使用activesocket重复连接/断开时发生内存泄漏

  21. 21

    使用regex.h时发生内存泄漏?

  22. 22

    使用AutomationElement类时可能发生内存泄漏

  23. 23

    使用SinkWriter(Media Foundation)C时发生内存泄漏

  24. 24

    在Windows上使用包XML时发生内存泄漏

  25. 25

    使用regex.h时发生内存泄漏?

  26. 26

    使用shared_ptr时发生内存泄漏

  27. 27

    过多的垃圾回收(和内存使用?)

  28. 28

    不了解内存使用/垃圾回收

  29. 29

    使用matplotlib发生内存泄漏

热门标签

归档