为什么要在删除对象时使用DebugBreak()

why getting DebugBreak() on deleting an object

本文关键字:DebugBreak 删除 对象 为什么      更新时间:2023-10-16

我有一个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()。这个问题只在调试模式下发生,在发布模式下没有问题。

如果我们假设你在问题中发布的代码是你正在使用的实际代码,问题可能是:

myobject* Dlg1 = new myobject();

注意Dlg1是一个局部变量,而不是成员变量。然后是这个:

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

上面代码中的Dlg1是类或结构A的成员变量Dlg1。由于您的代码错误地在本地创建了一个动态对象,因此它很可能从未初始化。在未初始化的指针上发出delete将造成严重破坏。

如果这是问题,那么要解决它,一个建议是在某处:

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

其中SomeFunctionA的另一个成员函数