小编Bru*_*uce的帖子

有谁能够在使用共享DLL的Windows 64位应用程序上集成tcmalloc?

我有一个要与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)

c++ tcmalloc memory-leak-detector

5
推荐指数
1
解决办法
4166
查看次数

标签 统计

c++ ×1

memory-leak-detector ×1

tcmalloc ×1