память — повреждение кучи — «Блок свободной кучи 61af0f0 изменен на 61af194 после того, как он был освобожден» Переполнение стека

В моем приложении я получаю эту ошибку:

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с распределениями.

Надеюсь, понятно, что я только что сказал. Если вам нужна дополнительная информация, пожалуйста, сообщите мне, и я предоставлю ее в редактировании этого вопроса.

6

Решение

Итак, насколько я знаю, ошибка, которую я получаю, вызвана доступом (повторным удалением) блока памяти, который уже был освобожден.

Если вы что-то знаете и не рассказываете нам, то вышеперечисленное может представлять собой красную сельдь. Ошибка может также означает, что вы модифицируете память через висячий указатель или из-за переполнения буфера.

Если вы когда-либо делаете копии указателей (либо явно, либо не определяя конструкторы копирования / операторы присваивания), задайте m_pVar = nullptr после удаления не будет гарантировано двойное удаление, не говоря уже о других типах ошибок памяти.

Если вы не можете найти проблему, изучив код, лучшим выбором может стать такой инструмент, как Valgrind или Purify.

10

Другие решения

Сбой во время malloc является верным признаком повреждения памяти, и это может быть или не быть из-за двойного удаления. Коррупция произошла в какой-то другой части вашего кода, и, к сожалению, эффект проявляется в вашем ошибочном коде, который определенно невинен. Если возможно, попробуйте перенести ваше приложение в систему, где вы можете запустить valgrind

2

По вопросам рекламы [email protected]