2011-07-06 29 views
1

アプリケーションの終了中に異常なヒープ破壊エラーが発生しました。コード内に "std :: vector"があり、削除されています。私の "ref_count"変数。私がstd :: vectorを持っていなければ、クラッシュはありません。 std :: vectorがあり、ref_count(メモリリークを引き起こす)を削除しないと、ヒープクラッシュが発生します。私は可能な限り小さなテストケースを作っていますが、残念ながらここでは大きすぎてhttp://codepad.org/USIPjPHJにあります。問題になる可能性のあることについて誰もが提案していますか?std :: vectorが存在するときにアプリケーションのヒープ破壊を引き起こすポインタ

出力ウィンドウでこれのヒープ例外を発生させてクラッシュします。


HEAP [CrashTest.exe]:HEAP:それはWindowsがCrashTest.exeにブレークポイントをトリガした を解放された後に空きヒープブロック6d4c30は6d4c58に変更します。

これは、CrashTest.exeまたはそれがロードしたDLLのバグを示す、ヒープの破損が原因である可能性があります。

これは、CrashTest.exeにフォーカスがある間にユーザーがF12キーを押したことが原因である可能性もあります。

出力ウィンドウには、より多くの診断情報が含まれている場合があります。


私のIDEは(も非SP1上で試してみました)のVisual Studio 2010 SP1であるが、それは問題を引き起こしてはいけません。

+0

トピックに質問があり、正しいものであれば回答を受け入れます。私の質問とその回答をチェックすると、私はいつもこれを受け取るわけではありません。 – chadb

+0

メンバーカウンタを動的に割り当てるのはなぜですか?それは正しく見えません。 – twsaef

+0

@chadb:あなたが与えた同様の回答に対する回答で指摘されたように、回答が十分でない理由を説明し、明確化や追加情報を求めるのはあなた次第です。悪い答えは、質問をしている人の過ちよりもしばしばです。 –

答えて

3

この行:出口1.

strong_ref<int> copy1(reg1); 

インクリメント* ref_count:

strong_ref<int> reg1; 

セットは、0(PTR == NULLため)に、このラインをref_countを*デストラクタは2回呼び出されます(reg1では1回、copy1では1回)。最初に* ref_countが0にデクリメントされ、ref_countが割り当て解除され、2回目の参照が残っていました。

+0

+1:これは正解です。 –

+0

興味深いことに、これは何の修正ですか? – chadb

+0

* ref_countは、ptrによって指されるオブジェクトへの参照の数(ptr == NULLの場合は0)とみなされます。したがって、ptr!= NULLの場合にのみ、ref_countが増減します。 – MRAB

関連する問題