最安全的方式链接谷歌的TCMalloc lib

时间:2016-09-19 16:10:10

标签: c++ c windows tcmalloc

经过几天的测试后,我发现运行时修补机制patch_functions.cc在生产环境中使用是不安全的。
它似乎在VS2010项目中运行良好,除了HeapAlloc()和HeapFree(),但由于一些未解决的问题Open Issues而无法在VS2015项目中使用。 windows自述文件描述了使用tcmalloc的另一种方法:

上述所有内容的替代方法是静态链接您的应用程序 用libc,然后用tcmalloc替换它的malloc。这可以让你 正常构建和链接您的程序; tcmalloc支持 进入后处理步骤。这比上述更可靠 技术(取决于运行时修补,这本质上是 脆弱的,虽然更多的工作要建立。有关详情,请参阅    https://groups.google.com/group/google-perftools/browse_thread/thread/41cd3710af85e57b

不幸的是,提供的喜欢是可以解压缩的,似乎谷歌已经关闭了这个群体。

有人可以解释一下如何做到这一点吗?

2 个答案:

答案 0 :(得分:1)

我认为它建议您编写自己使用malloc的{​​{1}}。

所以你必须定义并链接你自己的(通过创建或使用.c aka翻译单元)并写下这样的东西

tcmalloc

问题是:根据你的建筑系统或链接器,它可能会唠叨关于双重符号,也就是引用。然后你必须以某种方式排除libcs​​ #ifdef __cplusplus extern "C" { #endif #include <stdlib.h> void* malloc(size_t size) { return tcmalloc(size); } //Also define a free if memory which has been allocated by tcmalloc //needs to be freed by a special function // Like /* void free(void* ptr) { if (ptr) { tcfree(ptr); } } */ #ifdef __cplusplus } #endif ,或者自己更改libc。

答案 1 :(得分:0)

我也偶然发现了这个问题,并相信我找到了一种使它起作用的方法。

首先,在windows\config.h中,您必须替换

#undef WIN32_OVERRIDE_ALLOCATORS 

通过

#define WIN32_OVERRIDE_ALLOCATORS 

然后,这是最重要的,您必须确保两件事:

  1. windows\patch_functions.cc未编译和链接
  2. windows\overridde_functions.cc已编译并链接

起初,我省略了第2步,得到了一个几乎不起作用的DLL,其中一些内存分配显然是随机释放和覆盖的。

就我而言,确保这两个步骤只是确保我的windows\override_functions.cc VS2017项目中仅包含libtcmalloc