我有一个c++程序,它是通过java程序中的JNI调用的,我想用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)实际调用的函数(而不是malloc
,free
等),则此方法应该起作用。
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/