2011-09-10 22 views
2

私はどこで起動するのかわかりません...私のプログラムを閉じると、Visual Studioはヒープの破損エラーを表示し続けます。それが壊れる位置は様々です。 40時間以上のうちに、スマートポインタの削除、実装の隠蔽の削除、スマートポインタの再追加、すべてのクラスのコピー不可能化、デストラクタのプライベート化など、コードを変更するのに費やしました。スタックをboost :: shared_ptrとstd :: shared_ptr(私はそれが助けになるかどうかを見極めるために切り替えました)が必要でした。これはCLevelクラスとの関係がshared_ptrによって削除される時間の約75%です。ヒープの破損

デストラクタをプライベートにして削除する関数を作成した後、私はCLevelへのポインタでdeleteを呼び出すことにしました。それが私にエラーを与えた直後だった時間の50%のように。私はCLevelに入り、それぞれの変数がきれいに削除されていることを確認しました。そして、コードは基本クラスに入り、終了しました。ヒープエラーがポップアップしました。しかし、私は何が間違っていたかを理解することはできませんでした。そして、それは常にそこにエラーを与えたり、間違えたりしていませ時にはそれは後にエラーを投げ、私も前に信じています。特に、それが他のクラスで起こったので(これは単にCEntityまたはCEntityManagerと思う)、問題を見つけるのは難しいです。

クラス実装の中からスマートなポインタを削除した後、クラスの新しいインスタンス(CLevelとCEntityを特定する)を要求したので、何か変わったことをBoostとしていたと思っていました。 Application.run()が終了した後のエラー(スマートポインタは実行中です)。呼び出しスタックは、 "スカラー削除デストラクタ"の直後または少し後にエラーが発生したことを示しました。

休憩時間は無料です。今のところrealloc.cにあります。このエラーは1ヶ月のホールドのようなものです。プログラムの終了時にクラスを削除しないことにしましたが、それを修正しようと疲れましたが、プログラムの終了時にクラスを削除しないことにしましたが、出口で起こった後に行われることは?数分前、終了時にエラーが2回発生しました。そのうちの1つは、ALLEGRO_EVENT_QUEUEとALLEGRO_TIMERへのスマートポインタと関係があると思われ、それらを通常のポインタにして手動で削除し、2番目のポインタは消えました。

は今のところ、これはコールスタックです:!

ntdll.dllの771b0474()[フレームは、以下の間違ったおよび/または が欠落している可能性があり、ntdll.dllのためにロードされていないシンボル] ntdll.dllの! 7716afc3()
ntdll.dllの!7716b0ad()ntdll.dllの!77195665()
ntdll.dllの!77172990()ntdll.dllの!77195665()
ntdll.dllの!77172990()ntdll.dllの!77121fec( )

msvcr100d.dl l!_realloc_base(void * pBlock、unsigned int newsize) 行85 + 0x17バイトC msvcr100d.dll!realloc_help(void * pUserData、 unsigned int * pnNewSize、int nBlockUse、const char * szFileName、int nLine、int fRealloc)ライン832 + 0x10をバイトC++ msvcr100d.dll!_realloc_dbg(void *型pUserData、unsigned int型nNewSize、 int型nBlockUse、constのchar型* szFileName、INT NLINE)ライン1040 +として0x1B バイトC++ msvcr100d.dll!のrealloc(void *型pUserData、 unsigned int型 nNewSize)ライン60 + 0x13にバイトC++ アレグロ-5.0.4-モノリス-MD-debug.dll!636d78c0()
アレグロ-5.0.4-モノリス-MD-debug.dll!636e0474()
allegro-5.0.4-monolith-md-debug.dll!636d11fe( )
allegro-5.0.4-monolith-md-debug.dll!636d0905()
allegro-5.0.4-monolith-md-debug.dll!636d0703()Project Nairim。exe!アプリケーション::〜アプリケーション()行104 + 0xfバイトC++ プロジェクトNairim.exe!アプリケーション:: `スカラー削除デストラクタ '()+ 0x2bバイトC++プロジェクトNairim.exe!main()行8 + 0x2bバイトC++ プロジェクトNairim.exe!__ tmainCRTStartup()ライン555 + 0x19バイトC プロジェクトNairim.exe!mainCRTStartup()ライン371 C kernel32.dllの!750f339a()ntdll.dllの!77119ed2()
ntdll.dllの!77119ea5( )

これは(注意、それはデリータ機能に来たとき、私は問題だと思ったのコードです:これは最初の月前に現れ始めたとき、この関数は存在しませんでした)。

void PN::CLevelManager::destroyLevel(const pLevel _ptr) 
{ 
    assert(LevelMgr.get() != NULL); 
    std::cout << std::endl << LevelMgr.get(); 
    auto iter = std::find(LevelMgr->m_levelList.begin(), LevelMgr->m_levelList.end(), _ptr); 
    if (iter != LevelMgr->m_levelList.end()) 
     LevelMgr->m_levelList.erase(iter); 
    delete _ptr; 
} 

他にもあります。

これは(それはたくさんだ)私の完全なコードです:https://github.com/NaturalDre/Nairim

コードが凶悪またはひどく、私は謝罪構造に見えるので、もし私が独学プログラマーです。

誰かが私に問題を指摘してくれれば素晴らしいだろう。この種のものは私を失望させます。私はコンピュータが好きなのは、すべてが固定されていて、可変ではないからです(これを行うと、期待したものでなくても起こります)。このバグは飛び散り、そのようなものは私を狂わせる。プログラム内の関連するデータは変更されません。 CLevelはファイルを読み込んでマップを作成し、必要に応じて描画します。

また、いくつかのものが奇妙に見えるか、または完全に実装されていないように、私は急速に多くのものを変更していたことを覚えておいてください。

+2

うわー、それは本当に長い質問です。 –

+0

ヒープを破損した場合、ランダムな場所で問題を捕まえるのは当然です。同様の質問への私の答えを読んでみたいかもしれません:http://stackoverflow.com/questions/6557779/memory-allocation-heap-corruption-in-stdstring-constructor/6557811#6557811 –

+4

あなたは間違った場所を探していますカナリアが死亡した理由。はるか早く、鉱山の別の隅にメタン漏れが発生しました。 ''ヘッダーを使用してください。http://msdn.microsoft.com/en-us/library/974tc9t1.aspx –

答えて

2

忙しくなる時間はWinDbg,GFlags, and AppVerifierです。これらは、以前にプログラムをクラッシュさせ、デバッガに侵入してメモリ破損がどこで発生したかを確認できるツールです。

0

私はAppVerifierが良い方法であることを確認できます。私はいくつかの厄介なバグにそれを使ってきました。うまく動作します。 WinDbgとGFlagsを試したことはありませんでしたが、App VerifierとVisual Studioは問題の発生場所を明らかにするためにはっきりと作業しました。

0

AppVerifierはVS 2008の後にはサポートされていません.C++ Memory Validatorのようないくつかの選択肢があります。これは非常に有益で強力なツールです。