Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
替换malloc实现 我有一个C++程序,它是从JAVA程序中通过JNI调用的,我想用Doug Lea的DLMALLC实现替换C++程序中的内存分配器(IIUC,因为新操作符调用java下的Maloc),这是可行的。我还使用了STD:列表和STD:MAP在我的C++程序中,并且希望这些库函数也会在调用“新”操作符时使用DLMALLoc。我曾尝试使用LD_PRELOAD,但这似乎会导致JAVA程序也会调用dmalloc,我不想要它。是否将C++程序链接到LIbDLMLROCK.因此,编译它时,足以保证所有C++库函数都将使用DLMALLoc?如果是,可以提供一个如何链接dlmalloc的示例吗?谢谢_C++_Malloc - Fatal编程技术网

替换malloc实现 我有一个C++程序,它是从JAVA程序中通过JNI调用的,我想用Doug Lea的DLMALLC实现替换C++程序中的内存分配器(IIUC,因为新操作符调用java下的Maloc),这是可行的。我还使用了STD:列表和STD:MAP在我的C++程序中,并且希望这些库函数也会在调用“新”操作符时使用DLMALLoc。我曾尝试使用LD_PRELOAD,但这似乎会导致JAVA程序也会调用dmalloc,我不想要它。是否将C++程序链接到LIbDLMLROCK.因此,编译它时,足以保证所有C++库函数都将使用DLMALLoc?如果是,可以提供一个如何链接dlmalloc的示例吗?谢谢

替换malloc实现 我有一个C++程序,它是从JAVA程序中通过JNI调用的,我想用Doug Lea的DLMALLC实现替换C++程序中的内存分配器(IIUC,因为新操作符调用java下的Maloc),这是可行的。我还使用了STD:列表和STD:MAP在我的C++程序中,并且希望这些库函数也会在调用“新”操作符时使用DLMALLoc。我曾尝试使用LD_PRELOAD,但这似乎会导致JAVA程序也会调用dmalloc,我不想要它。是否将C++程序链接到LIbDLMLROCK.因此,编译它时,足以保证所有C++库函数都将使用DLMALLoc?如果是,可以提供一个如何链接dlmalloc的示例吗?谢谢,c++,malloc,C++,Malloc,如果您的程序不调用任何分配您需要释放的内存的libc函数(如realpath),您可以静态链接dlmalloc并仔细管理导出的符号集。如果只导出JNI接口实际调用的那些函数(而不是malloc、free等),这应该可以工作 JNIAPI具有回调函数,这些回调函数将调用malloc/free,这些回调函数将保留原始流程中的回调函数,但事情将保持一致,因为malloc/free实现将匹配 但是,您应该确保dlmalloc变体不使用brk/sbrk,只使用mmap,从操作系统进行分配,因为旧的分配形式

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

JNIAPI具有回调函数,这些回调函数将调用
malloc
/
free
,这些回调函数将保留原始流程中的回调函数,但事情将保持一致,因为
malloc
/
free
实现将匹配

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


对于ELF环境中的符号管理,的第2.2节(导出控制)是一个很好的参考。

我不一定认为使用链接器玩游戏不好,但我有另一种选择

如果DLMLoLc有一个符号不是“Maloc”的库,则可以覆盖全局C++ +Cuxor运算符new < /C>,<代码>运算符new []/COD>,<代码>运算符删除< /C> >和<代码>运算符删除[]/Cord>,用自己的版本调用MALOC和DLMALOC版本。 <>这将导致所有C++分配都通过你的重载,包括库函数。此行为由标准保证。但是,如果您有两个不同版本的这些重载,则未指定调用哪个。但是很明显,如果标准库本身有一个版本,那么您的版本应该优先

这将不包括您可能调用的任何C标准库函数。不管怎么说,他们仍然会使用
malloc
符号,如果不使用链接器玩游戏,你也无能为力。幸运的是,在大多数C++程序中,将没有很多方式以标准的方式调用标准C库。
重新编译程序是不够的。事实上它将在很大程度上无法实现任何东西,因为< C++ > > < <代码> >代码>删除>代码>运算符不会出现在标准库头中,因此预处理器将无法替换DLMALLoc库所提供的任何函数<代码> MalOC 。
operator new
的版本可以调用
std::malloc
std::aligned\u alloc
(从C++17开始)这是一个有趣的问题。即使它将设置C宏,用调用
dlmalloc
(或任何它的名称)替换对
malloc
的调用,我也不确定重新编译程序是否足够<代码> LBC< /COD>有时调用Calp> Mulalc < /代码>,C++运算符new也可能调用一个名为“代码> MalOC < /COD>的函数,而不给预处理器一个干预的机会。我只需要实现一个全局<代码>操作符new < /Calp>和<代码>操作符删除< /Cord> >,称为<代码> DLMALLC/<代码>,并将其置于此。C库可能仍然会调用malloc来完成一些事情,但是如果您愿意接受Java来做这件事,那么C库也可以做一点。但是我相信C++需要一个程序能够用自己的方式覆盖全局操作符,并且标准库不干扰这个。是的,你自己的版本将替换:这也证明了“不能保证在C++中使用MALOC”的东西。这是一个Windows特定的解决方案吗?您如何“小心地管理导出的符号集”?@Omnifarious,我不认为Windows是
realpath
。我添加了对ELF符号管理文档的引用。谢谢。我知道在Linux(和其他基于ELF的Unix)上做这种事情是可能的,但我从未尝试过。