- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个 64 位 Visual Studio 2010(单线程)C++ Windows 应用程序,我试图将它与 tcmalloc 集成,但在使用任何动态链接的 dll 时遇到问题。我将 tcmalloc 链接为静态库。在应用程序开始使用我们共享的 dll 之一之前,tcmalloc 工作得很好。我将解决方案构建为 64 位 DEBUG 应用程序。所有 dll 与 CRT 库的 C/C++ 调试版本(MSVCP100D.dll 和 MVCR100D.dll)的链接。
下面是失败的代码示例。 tcmalloc 被调用用于所有内存分配,但是当调用 delete 时应用程序崩溃。当我在主可执行文件中创建一个函数并将代码复制到那里时,完全相同的代码工作正常,这让我感到非常困惑。
如果有人有在这种情况下使用 tcmalloc 的任何经验,我将不胜感激您的反馈。这对我来说是个谜。它是 dll 的内存模型问题(不同的堆 ??)?我不知道。在我看来,他们正在使用相同的堆。
抱歉,如果这篇文章太长。我试图提供尽可能多的信息。
谢谢。
布鲁斯
更新:作为测试,我将崩溃的共享 dll 更改为静态库,一切正常,直到应用程序使用不同的 dll。因此,无论出于何种原因,tcmalloc 都需要一些额外的步骤来处理共享的 dll。我可以使用 tcmalloc 为内存分析创建我们所有的 dll 静态库,但如果知道还需要做什么才能使用 shared 就更好了带有 tcmalloc 的 dll。
DLL头文件方法声明:__declspec(dllexport) 静态 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 ) ;
execPathStr = execPathStr.substr( 0, dir_pos+1 );
}
return execPathStr;
}
临时字符串销毁时调用的方法:
~_String_val()
{
// destroy the object
typename _Alloc::template rebind<_Container_proxy>::other _Alproxy(_Alval);
this->_Orphan_all();
_Dest_val(_Alproxy, this->_Myproxy);
**_Alproxy.deallocate(this->_Myproxy, 1);**
this->_Myproxy = 0;
}
void deallocate(pointer _Ptr, size_type)
{
// deallocate object at _Ptr, ignore size
**::operator delete(_Ptr);**
}
This is where it crashes. the pHead->nBlockUse is 0.
crt/dbgdel.cpp:
void operator delete(
void *pUserData
)
{
//code omitted for brevity
/* verify block type */
**_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));** //crashes here
}
将 tcmalloc 重建为共享 DLL 后,它现在在尝试释放内存时会在不同的地方崩溃。
afxmem.cpp:
void __cdecl operator delete(void* p)
{
#if !defined(_AFX_NO_DEBUG_CRT) && defined(_DEBUG)
**_free_dbg(p, _NORMAL_BLOCK);** <-------- this function gets called
#else
free(p);
#endif
}
dbgheap.c:
extern "C" _CRTIMP void __cdecl _free_dbg(
void * pUserData,
int nBlockUse
)
{
_mlock(_HEAP_LOCK);
__try {
/* allocate the block
*/
**_free_dbg_nolock(pUserData, nBlockUse);**
}
__finally {
/* unlock the heap
*/
_munlock(_HEAP_LOCK);
}
}
extern "C" void __cdecl _free_dbg_nolock(
void * pUserData,
int nBlockUse
)
{
//code omitted for brevity
/*
* If this ASSERT fails, a bad pointer has been passed in. It may be
* totally bogus, or it may have been allocated from another heap.
* The pointer MUST come from the 'local' heap.
*/
**_ASSERTE(_CrtIsValidHeapPointer(pUserData));** <-------- crashes here
}
最佳答案
我们终于让 tcmalloc 在具有共享 dll 的 Windows 64 位平台上工作。感谢 Captain Oblivious 的建议!诀窍是在 Visual Studio 2010 中使用本文所述的调试符号构建发布版本:How to: Debug a Release Build . tcmalloc 与 MFC 中的 CRT 调试堆调用有冲突,例如:_free_dbg。我们从 tcmalloc 分配内存并从 MFC CRT 堆调试调用中释放内存。在发布版本中,该问题消失了。我们做了一些初步测试,tcmalloc 正在生成堆分析调用图。
谢谢。
布鲁斯
关于c++ - 有没有人能够在使用共享 DLL 的 Windows 64 位应用程序上集成 tcmalloc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14243186/
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 Improve th
所以我正在开发一个黑 jack 程序,但我有点卡住了。我会警告大家,我对编程真的很陌生,而且,我正在项目中期......所以有一些松散的结局和未使用的变量,以及一些不必要的逻辑(用于测试),但这就是我
我正在尝试创建一个可用作 OpenGL 测试工具的示例程序。到目前为止,我的那个似乎可以工作,但似乎忽略了通过统一变量 MVPMatrix 传递的 MVP 矩阵。当我添加代码以读回制服并检查它是否确实
感谢您帮助我,这是有关我的代码的部分。 printf("Thank you, now please enter the logic gate"); scanf("%s", &C); if (C ==
public static void ejemplosString(String palabra){ char[] letras = palabra.toCharArray();
所以,我有一个 php 应用程序,通过 cgi 和 nginx 运行。我有一个 .jar 程序,用于在条形码打印机(Zebra)上打印条形码,猜猜看是什么!。 我的 php 应用程序使用 exec()
我遇到的唯一问题是 getAll() 方法,它似乎在 PersonnelController 类中的位置立即运行。我也曾在其他很多地方尝试过,但都没有成功。 setAll() 方法看起来不错,我已经测
我是一名优秀的程序员,十分优秀!