0

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


以上所有方法的替代方法是将您的应用程序与 libc 静态链接,然后将其 malloc 替换为 tcmalloc。这使您可以正常构建和链接程序;tcmalloc 支持来自后处理步骤。这比上述技术更可靠(它依赖于运行时补丁,它本质上是脆弱的),尽管需要做更多的工作。有关详细信息,请参阅 https://groups.google.com/group/google-perftools/browse_thread/thread/41cd3710af85e57b


不幸的是,所提供的点赞是不可取的,似乎谷歌已经关闭了该组。

有人可以解释一下我该怎么做吗?

4

2 回答 2

1

我认为它建议您自己编写malloc使用tcmalloc.

因此,您必须定义并链接您自己的(通过创建或使用 .c aka 翻译单元)并编写类似这样的内容

#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

问题是:根据您的构建系统或链接器,它可能会唠叨双符号,也就是引用。然后你必须以某种方式排除 libcsmalloc​​ ,或者自己更改 libc 。

于 2016-09-19T16:22:15.630 回答
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包含在我的libtcmallocVS2017 项目中。

于 2019-01-15T15:23:04.487 回答