2

数日間、ヒープの破損の問題に苦しんでいます。以前に新しく作成したオブジェクトを削除した後、ヒープを破損した可能性があることをvs 2005デバッガーから最初に警告されました。この問題について調査した結果、gflags とページ ヒープの設定にたどり着きました。特定の画像に対してこの設定を有効にした後、実際に破損を引き起こしている行を指摘したと思われます。

Gflags は、問題のオブジェクトのコンストラクターを原因として特定しました。オブジェクトは次のように派生します。

class POPUPS_EXPORT MLUNumber :  public MLUBase
  {
...
  }
class POPUPS_EXPORT MLUBase : public BusinessLogicUnit
  {
...
  }

別のスレッドで MLUNumber をインスタンス化でき、ヒープの破損は発生しません。

ヒープの破損を引き起こさない、MLUBase からも継承する別のクラスをインスタンス化できます。

アクセス違反は、オブジェクトの暗黙的な初期化 (?) が原因であると思われる、コンストラクターの左中かっこで発生する破損が原因で発生します。

基本クラス コンストラクター (MLUBase) が正常に終了します。

vs 2005 のメモリ ウィンドウを掘り下げると、実際のオブジェクトに十分なスペースが割り当てられていないようです。私の推測では、基本クラスのみに十分な量が割り当てられました。

障害の原因となっている行:

BusinessLogicUnit* biz = new MLUNumber();

これを引き起こす可能性のある理由か、別のトラブルシューティング手順に従うことを望んでいます。

4

5 に答える 5

6

残念ながら、提供された情報では、問題を明確に診断することはできません。

あなたがチェックしたいかもしれないいくつかのこと:

  • BusinessLogicUnit に仮想デストラクタがあることを確認してください。ベース ポインターを介してオブジェクトを ing する場合delete、サブクラスが適切に破棄されるようにするには、仮想デストラクタがベース クラスに存在する必要があります。
  • すべてのソース ファイルを同じプリプロセッサ フラグとコンパイラ オプションでビルドしていることを確認してください。フラグの違い (おそらくデバッグ/リリース フラグの間?) により、構造体のサイズが変更され、異なるソース ファイルでレポートされるサイズに矛盾が生じる可能性があります。
  • gflags の設定があっても、一部の種類のヒープ破損が検出されない可能性があります。他のヒープの使用を監査して、問題の原因も見つけてください。理想的には、原因を絞り込むことができるように、確実にクラッシュする最小限のアクティビティを含む最小限のテスト ケースを作成する必要があります。
  • クリーンなソリューションを試して再構築してください。時折、タイムスタンプがおかしくなり、古いオブジェクト ファイルが古い構造定義で入り込んでしまうのを見てきました。少なくともチェックする価値があります:)
于 2011-06-24T19:53:54.757 に答える
2
BusinessLogicUnit* biz = new MLUNumber();

メモリーを削除する方法を教えてください。基本クラスのポインターを使用していますか? BusinessLogicUnit仮想のデストラクタを作成しましたか? である必要がありますvirtual

class BusinessLogicUnit
{
  public:
      //..
      virtual ~BusinessLogicUnit(); //it must be virtual!
};

それ以外の場合、基底クラス ポインターを介して派生クラス オブジェクトを削除すると、C++ 標準に従って未定義の動作が呼び出されます。

于 2011-06-24T19:52:29.843 に答える
0

何が問題なのかを理解するのに十分な情報がまだないという bdonlan に同意します。ここには多くの良い提案がありますが、アプリケーションがクラッシュする理由を推測するだけでは、問題を根本的に解決する賢明な方法ではありません。

問題を絞り込むのに役立つインストルメンテーション (ページヒープ) を有効にすることで、正しいことを行いました。アクセス違反の原因となっているメモリ アドレス (およびそのアドレスがどこから来たのか) を正確に突き止めることで、このパスをたどります。

于 2011-06-24T20:31:18.330 に答える
0

BusinessLogicUnit はMLUNumberではありません。なぜこのように割り当てるのですか?代わりに BusinessLogicUnit* biz = new BusinessLogicUnit();

于 2011-06-24T19:48:24.980 に答える
0

それとも、あなたはこのようなことをしますか?

struct A
{
    SomeType & m_param;

    A(SomeType & param) : m_param(param)
    {
        ...use m_param here...
    }
};

A a(SomeType()); // passing a temporary by reference

次に、参照された一時的なものが発生した直後に死ぬため、それは未定義の動作m_param(param)です..

于 2011-06-24T19:56:08.317 に答える