经过几天的测试后,我发现运行时修补机制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
不幸的是,提供的喜欢是可以解压缩的,似乎谷歌已经关闭了这个群体。
有人可以解释一下如何做到这一点吗?
答案 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
然后,这是最重要的,您必须确保两件事:
windows\patch_functions.cc
未编译和链接windows\overridde_functions.cc
已编译并链接起初,我省略了第2步,得到了一个几乎不起作用的DLL,其中一些内存分配显然是随机释放和覆盖的。
就我而言,确保这两个步骤只是确保我的windows\override_functions.cc
VS2017项目中仅包含libtcmalloc
。