8

私のアプリケーションでは、次のエラーが発生します。

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

だから私が知っていることから、私が得ているエラーは、すでに解放されたメモリのブロックにアクセスする(再度削除する)ことによって引き起こされます。私のコードの何が問題なのかを突き止めようとして、すでに 3 日目です。この間、いくつかの小さなメモリ リークを見つけましたが、それらは既に修正済みで、現在、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)関数が存在しないこともありますが、常にstrings 割り当てと関係があります。

私が今言ったことは明らかだと思います。さらに情報が必要な場合は、お知らせください。この質問に編集して提供します。

4

2 に答える 2

13

だから私が知っていることから、私が得ているエラーは、すでに解放されたメモリのブロックにアクセスする(再度削除する)ことによって引き起こされます。

あなたが知っていて私たちに伝えていないことがない限り、上記は十分にニシンである可能性があります. このエラーは、ダングリング ポインターを介してメモリを変更していること、またはバッファ オーバーランが原因である可能性もあります。

ポインターのコピーを (明示的に、またはコピー コンストラクター/代入演算子の定義に失敗して) 作成したことがある場合、m_pVar = nullptr削除時の設定は、他の種類のメモリ エラーは言うまでもなく、二重削除に対する保証を提供しません。

コードを調べても問題が見つからない場合は、Valgrind や Purify などのツールを使用することをお勧めします。

于 2013-01-04T11:22:36.657 に答える