Heap-Beschädigung - "Freier Heap-block 61af0f0 geändert 61af194, nachdem es freigegeben wurde" C++

In meiner Anwendung, die ich bin immer diese Fehlermeldung:

HEAP[App.exe]: HEAP: Free Heap block 61af0f0 modified at 61af194 after it was freed

Hier ist ein call stack:

    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

Also von dem, was ich weiß, die Fehler, die ich bin immer verursacht, durch den Zugriff auf (wieder löschen) - block von Speicher, der bereits freigegeben wurde. Es ist bereits der Dritte Tag versuchen, herauszufinden, was genau ist falsch an meinem code. Während dieser Zeit fand ich einige kleine Speicherlecks, die ich schon behoben, und nun Visual-Leck-Detektor sagt mir, dass es nicht erkennen einer Leckage.

Noch das problem mit dem heap-Beschädigung bleibt.

In jedem Ort, der meinen code in einem Ort, wo "delete" - operator verwendet wird, überprüfe ich zuerst, ob ein Zeiger ist nicht nullptr. Wenn nicht, habe ich es zu nullptr:

if(m_pVar != nullptr)
{
    delete m_pVar;
    m_pVar = nullptr;
}

So, wie es scheint, sollte es kein problem mit der Befreiung der gleiche block im Speicher mehr als einmal.

Ich habe versucht, etwas herauszufinden, von diesem call-stack, aber das ist der Ort, an dem ich möchte Sie bitten, für eine Hilfe. In einem call-stack wie es scheint, ein problem mit string Aufteilung, aber was genau kann das bedeuten? Die Letzte Funktion, die aufgerufen wird, ist string TUtil::intToString(int val) Line 43, so kann es einfacher sein, wenn ich Ihnen zeigen, ein Körper der Funktion:

std::string TUtil::intToString(int val)
{
    std::ostringstream s;
    s << val;                 //Here's line 43
    return s.str();
}

Manchmal call-stack ist anders, so string TUtil::intToString(int val) Funktion gar nicht existiert, aber es hat IMMER etwas damit zu tun strings Zuweisungen.

Ich hoffe es ist klar was ich gerade gesagt habe. Wenn Sie weitere Informationen benötigen, bitte sagen Sie mir, und ich werde es Bearbeiten, um diese Frage.

Sind Sie auf einer Plattform, wo Valgrind ist eine option?
Wenn Sie arbeiten, linux, versuchen Sie, überprüfen Sie Ihre Anwendung mit Valgrind
Haben Sie definierten copy-Konstruktor und Zuweisungs-operator oder explizit nicht erlaubte kopieren von Instanzen der Klasse, die Mitglied m_pVar?
Oder nutzen Sie einfach RAII.
Nur eine Anmerkung: es ist vollkommen sicher in der löschen Sie einen nullptr. der check ist unnötig

InformationsquelleAutor Piotr Chojnacki | 2013-01-04

Schreibe einen Kommentar