1

と呼ばれるMFCダイアログがありますDlg1

myobject* Dlg1 = new myobject();

このダイアログには、A という親ダイアログがあります。閉じるときに呼び出される関数が A にあります。

A::Destroy()
{
     if(Dlg1 )
           delete  Dlg1; // this is triggering `DebugBreak(); here i get A.exe has triggered a breakpoint, 
     // the rest of the code 
}

閉じるDlg1ボタンをクリックして手動でダイアログを閉じてからメインダイアログを閉じるとA、すべて問題ありません。ただし、Dlg1実行中に A を閉じると、 が表示されますDebugBreak()。この問題はデバッグ モードでのみ発生し、リリース モードでは問題ありません。

4

1 に答える 1

2

質問に投稿したコードが実際に使用しているコードであると想定する場合、問題は次の可能性があります。

myobject* Dlg1 = new myobject();

Dlg1メンバー変数ではなく、ローカル変数であることに注意してください。次に、これがあります:

A::Destroy()
{
  if (Dlg1 )
     delete  Dlg1; 
}

上記Dlg1のコードの は、Dlg1class または struct のメンバー変数ですA。コードが誤って動的オブジェクトをローカルに作成したため、おそらく初期化されませんでした。delete初期化されていないポインターに対してa を発行すると、大混乱が生じます。

これが問題である場合、それを修正するための 1 つの提案は、どこかに置くことです。

A::SomeFuntion()
{
    //...
    Dlg1 = new myobject();  // set the member variable Dlg1, not a local variable.
    //...,
}

どこSomeFunctionで の別のメンバー関数になりAます。

于 2014-07-21T22:06:51.707 に答える