在文件gperftools-2.2.1 / src / gperftools / malloc_extension.h中,它显示为:
// Extra extensions exported by some malloc implementations. These
// extensions are accessed through a virtual base class so an
// application can link against a malloc that does not implement these
// extensions, and it will get default versions that do nothing.
//
// NOTE FOR C USERS: If you wish to use this functionality from within
// a C program, see malloc_extension_c.h.
我的问题是如何通过虚拟基类访问这些扩展?
通常从动态库加载一个类,我需要编写一个基类,它允许我通过多态来获取所需类的实例及其函数,如here所述。
但是要这样做,API中必须有一些类工厂函数,但在任何tcmalloc文件中都没有这样的函数。此外,我还需要使用dlopen()加载tcmalloc库,根据安装说明不推荐使用:
...通过dlopen加载malloc替换库是 在任何情况下都要求麻烦:一些数据将分配一个malloc,一些数据与另一个分配。
如此清楚地通过上述典型方式访问扩展不是一种选择。我可以使用malloc_extensions_c.h中声明的C版本,但只是想知道是否有更好的解决方案。
答案 0 :(得分:0)
我设法通过一些'hack'加载malloc扩展,这不像我想的那样干净,但它完成了工作。对于那些感兴趣的人来说,这是(临时)解决方案。
首先,大多数这些malloc扩展函数类似于静态函数,它们大多只在当前实例上调用,例如,要调用当前进程的GetMemoryReleaseRate()
函数,只需调用MallocExtension::instance()->GetMemoryReleaseRate()
。因此,我们不需要创建基类并获取MallocExtension类的实例来调用这些函数。
对于上面的示例,我只创建一个独立函数getMemoryReleaseRate(),它在调用时只调用所需的函数,如下所示:
getMemoryReleaseRate()
{
MallocExtension::instance()->GetMemoryReleaseRate();
}
此功能可以直接插入源文件,例如tcmalloc.cc,或者,如果您不想在每次有新版本时编辑tcmalloc源,请添加到生成文件中,以便在编译时附加到源文件。
现在在您的代码中,您可以通过dlsym()创建的'facade'函数调用MallocExtension函数,例如:如下:
typedef void (*getMemoryReleaseRate)();
((getMemoryReleaseRate)dlsym(RTLD_DEFAULT, "getMemoryReleaseRate"))();
答案 1 :(得分:0)
只需包含此标头并执行MallocExtension :: instance() - > GetMemoryReleaseRate();也会工作。无需为此修改tcmalloc。