gpt4 book ai didi

c++ - 替换 malloc 实现

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:07:40 30 4
gpt4 key购买 nike

我有一个从 Java 程序通过 JNI 调用的 C++ 程序,我想用 Doug Lea 的 dlmalloc 实现替换 C++ 程序中的内存分配器(IIUC 这是可行的,因为新运算符在下面调用 malloc)。我还在我的 C++ 程序中使用了 std:list 和 std:map,并且希望这些库函数在调用“new”运算符时也将使用 dlmalloc。我试过使用 LD_PRELOAD 但它似乎导致 dmalloc 也将从 JAVA 程序中调用,我不想要它。在编译时将 c++ 程序与 libdlmalloc.so 链接是否足以保证所有 c++ 库函数都将使用 dlmalloc?如果是这样,可以提供一个如何链接 dlmalloc 的示例吗?谢谢

最佳答案

如果您的程序没有调用任何分配您需要释放的内存的 libc 函数(例如 realpath),您可以静态链接 dlmalloc 并仔细管理一组导出的符号。如果您只导出 JNI 接口(interface)实际调用的那些函数(而不是 mallocfree 等),这应该可行。

JNI API 有回调函数,会调用 malloc/free,那些会保留原来进程中的回调函数,但事情会保持一致,因为 >malloc/free 实现将匹配。

但是,您应该确保您的 dlmalloc 变体不使用 brk/sbrk,仅使用 mmap,用于从操作系统进行分配因为旧的分配形式可能会干扰系统 malloc

对于 ELF 环境中的符号管理,Ulrich Drepper's How To Write Shared Libraries 的第 2.2 节(导出控制)是一个很好的引用。

关于c++ - 替换 malloc 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47146036/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com