在我的应用程序中,我收到此错误:
HEAP[App.exe]: HEAP: Free Heap block 61af0f0 modified at 61af194 after it was freed
这是一个调用堆栈:
ntdll.dll!_RtlpBreakPointHeap@4() Unknown
ntdll.dll!@RtlpAllocateHeap@24() Unknown
ntdll.dll!_RtlAllocateHeap@12() Unknown
ntdll.dll!_RtlDebugAllocateHeap@12() Unknown
ntdll.dll!@RtlpAllocateHeap@24() Unknown
ntdll.dll!_RtlAllocateHeap@12() Unknown
> msvcr110d.dll!_heap_alloc_base(unsigned int size) Line 57 C
msvcr110d.dll!_heap_alloc_dbg_impl(unsigned int nSize, int nBlockUse, const char * szFileName, int nLine, int * errno_tmp) Line 431 C++
msvcr110d.dll!_nh_malloc_dbg_impl(unsigned int nSize, int nhFlag, int nBlockUse, const char * szFileName, int nLine, int * errno_tmp) Line 239 C++
msvcr110d.dll!_nh_malloc_dbg(unsigned int nSize, int nhFlag, int nBlockUse, const char * szFileName, int nLine) Line 302 C++
msvcr110d.dll!malloc(unsigned int nSize) Line 56 C++
msvcr110d.dll!operator new(unsigned int size) Line 59 C++
App.exe!std::_Allocate<char>(unsigned int _Count, char * __formal) Line 28 C++
App.exe!std::allocator<char>::allocate(unsigned int _Count) Line 591 C++
App.exe!std::basic_stringbuf<char,std::char_traits<char>,std::allocator<char> >::overflow(int _Meta) Line 152 C++
msvcp110d.dll!std::basic_streambuf<char,std::char_traits<char> >::sputc(char _Ch) Line 196 C++
msvcp110d.dll!std::ostreambuf_iterator<char,std::char_traits<char> >::operator=(char _Right) Line 634 C++
msvcp110d.dll!std::num_put<char,std::ostreambuf_iterator<char,std::char_traits<char> > >::_Put(std::ostreambuf_iterator<char,std::char_traits<char> > _Dest, const char * _Ptr, unsigned int _Count) Line 1553 C++
msvcp110d.dll!std::num_put<char,std::ostreambuf_iterator<char,std::char_traits<char> > >::_Iput(std::ostreambuf_iterator<char,std::char_traits<char> > _Dest, std::ios_base & _Iosbase, char _Fill, char * _Buf, unsigned int _Count) Line 1544 C++
msvcp110d.dll!std::num_put<char,std::ostreambuf_iterator<char,std::char_traits<char> > >::do_put(std::ostreambuf_iterator<char,std::char_traits<char> > _Dest, std::ios_base & _Iosbase, char _Fill, long _Val) Line 1216 C++
msvcp110d.dll!std::num_put<char,std::ostreambuf_iterator<char,std::char_traits<char> > >::put(std::ostreambuf_iterator<char,std::char_traits<char> > _Dest, std::ios_base & _Iosbase, char _Fill, long _Val) Line 1137 C++
msvcp110d.dll!std::basic_ostream<char,std::char_traits<char> >::operator<<(int _Val) Line 311 C++
App.exe!TUtil::intToString(int val) Line 43 C++
App.exe!TFontManager::getFont(const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & filename, int size) Line 15 C++
App.exe!TButton::draw() Line 55 C++
App.exe!TWindow::draw() Line 203 C++
App.exe!TGUIManager::drawObjects() Line 49 C++
App.exe!TGameAppLayer::gameCycle() Line 456 C++
App.exe!TGameAppLayer::mainLoop() Line 520 C++
App.exe!wWinMain(HINSTANCE__ * hInstance, HINSTANCE__ * hPrevInstance, wchar_t * lpCmdLine, int nCmdShow) Line 36 C++
App.exe!__tmainCRTStartup() Line 528 C
App.exe!wWinMainCRTStartup() Line 377 C
kernel32.dll!@BaseThreadInitThunk@12() Unknown
ntdll.dll!___RtlUserThreadStart@8() Unknown
ntdll.dll!__RtlUserThreadStart@8() Unknown
所以据我所知,我得到的错误是由于访问(再次删除)已经释放的内存块引起的。已经是第三天尝试找出我的代码到底出了什么问题。在这段时间里,我发现了一些我已经修复的小内存泄漏,现在Visual Leak Detector告诉我它没有检测到任何泄漏。
然而,堆腐败的问题仍然存在。
在我的代码的每个地方使用“delete”运算符的地方,我首先检查指针是否不是nullptr
。如果没有,我将其设置为nullptr
:
if(m_pVar != nullptr)
{
delete m_pVar;
m_pVar = nullptr;
}
所以看起来不应该有多次释放同一块内存的问题。
我试图从这个调用堆栈中找出一些东西,但那是我想请求你帮助的地方。在调用堆栈中,似乎问题在于string
分配,但这到底意味着什么呢?被调用的最后一个MY函数是string TUtil::intToString(int val) Line 43
,因此如果我向您展示该函数的主体可能会更容易:
std::string TUtil::intToString(int val)
{
std::ostringstream s;
s << val; // Here's line 43
return s.str();
}
有时候调用堆栈是不同的,因此string TUtil::intToString(int val)
函数甚至不存在,但它始终与string
的分配有关。
我希望我说的很清楚。如果您需要更多信息,请告诉我,我将在编辑中提供此问题。
答案 0 :(得分:10)
所以据我所知,我得到的错误是由于访问(再次删除)已经释放的内存块造成的。
除非您知道并且没有告诉我们,否则以上内容很可能是红鲱鱼。错误可能也意味着您通过悬空指针或缓冲区溢出来修改内存。
如果你曾经制作指针的副本(显式地,或者未能定义复制构造函数/赋值运算符),删除时设置m_pVar = nullptr
将不提供双重删除的保证,更不用说其他类型的内存错误了。
如果您通过检查代码找不到问题,那么您最好的选择可能是像Valgrind或Purify这样的工具。
答案 1 :(得分:2)
malloc期间出现崩溃是内存损坏的明确迹象,它可能是也可能不是由于双重删除。腐败发生在您的代码的某些不同部分,不幸的是,这些影响在您的失败代码中涟漪,这绝对是无辜的。如果可能,尝试在可以运行valgrind的系统中移植应用程序