我有一个要与tcmalloc集成的64位Visual Studio 2010(单线程)C ++ Windows应用程序,使用任何动态链接的dll时都遇到问题。我将tcmalloc链接为静态库。tcmalloc可以很好地工作,直到应用程序开始使用我们共享的dll之一。我将解决方案构建为64位DEBUG应用程序。dll的所有链接都与CRT库的C / C ++调试版本(MSVCP100D.dll和MVCR100D.dll)链接。
以下是失败代码的示例。将为所有内存分配调用tcmalloc,但是调用delete时,应用程序崩溃。当我在主可执行文件中创建函数并将代码复制到那里时,完全相同的代码可以正常工作,这让我感到非常困惑。
如果有人在这种情况下使用tcmalloc有任何经验,我将感谢您的反馈。这对我来说是个谜。dll的内存模型问题(不同的堆??)吗?我不知道。在我看来,他们正在使用同一堆。
抱歉,如果这篇文章太长。我试图提供尽可能多的信息。
谢谢。
布鲁斯
更新:作为测试,我将崩溃的共享dll更改为静态库,并且一切正常,直到应用程序使用其他dll。因此,无论出于何种原因,tcmalloc都需要一些其他步骤来处理共享的dll。我可以使用tcmalloc来制作所有dll的静态库以进行内存分析,但是,知道将tdllalloc与共享dll一起使用还需要做些什么,这真的很高兴。
DLL标头文件方法声明:__declspec(dllexport)static std :: string GetExecutablePath();
//.cpp实现
string Parameters::GetExecutablePath()
string execPathStr;
char exeFilePath[ MAX_PATH +1];
if ( GetModuleFileName( NULL, exeFilePath, MAX_PATH ) )
{
//The line of code below is where the app crashes.
//It calls operator new in crt/src/new.cpp. I verified the call to malloc
//is forwarded to tcmalloc.
*execPathStr = string(exeFilePath);* //creates and deletes a temporary and then crashes
long dir_pos = execPathStr.rfind( FT_DIR_SLASH ) …Run Code Online (Sandbox Code Playgroud)