【问题标题】:why getting DebugBreak() on deleting an object为什么在删除对象时获取 DebugBreak()
【发布时间】:2014-07-21 21:26:09
【问题描述】:

我有一个 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()。这个问题只在debug模式下出现,在release模式下没问题。

【问题讨论】:

  • '有谁知道是什么触发了这个?' 例如删除一个已经删除的指针...
  • 调试堆检测到堆损坏。不错的功能。找到原因当然绝非易事。
  • 调用delete 时无需检查NULL。因此,检查 if(Dlg1 ) 对您根本没有帮助,除非您连续多次在同一个对象上调用 Destroy()。
  • @Samer '我这样做' 那么,你为什么不在你的示例中展示它呢?你认为这无关紧要吗?
  • @Samer - 此代码是否正确myobject* Dlg1 = new myobject();?如果是这样,那么 Dlg1 是一个局部变量,与您在 Destroy 方法中的 Dlg1 不同,或者它是(天堂禁止)一个全局变量。

标签: c++ mfc debugbreak


【解决方案1】:

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

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.
    //...,
}

其中SomeFunction 将是A 的另一个成员函数。

【讨论】:

  • Paul,Dlg1 是 A 的成员。
  • 我确定'Dlg1'没有被明确删除,但是,在A关闭或销毁之前,我调用了Dlg1->Onclose(),它调用了Dlg1->OnDestroy(),所以如果最后一个调用已经删除了Dlg1,那么是的,那么这是双重删除。
猜你喜欢
  • 1970-01-01
  • 2020-12-12
  • 2016-02-12
  • 2020-02-25
  • 1970-01-01
  • 1970-01-01
  • 2018-05-22
  • 2013-07-10
  • 1970-01-01
相关资源
最近更新 更多