我在 VS2010 中调试我的 C++ Win32 程序,我总是得到“Windows 已在 program.exe 中触发断点”。
我对代码进行了双重检查、三次检查和四次检查。我找不到任何它应该发生的理由。但它每次都发生在同一点,所以一定有什么东西。
涉及到相当多的代码(构造函数、析构函数、窗口消息、内存分配和释放等等...)所以很难在这里给出具体的东西,但同时我明白没有代码你真的不能做太多的解释。
基本上只要点击一个按钮,就会出现一个显示图像的窗口。如果满足特定条件,我将 WM_DESTROY
发送到该窗口并删除触发析构函数的变量,该析构函数在我的 LPPICTURE
上调用 Release()
>,释放的变量被设置为 NULL
。
然后,当用户再次单击该按钮时,它会尝试动态分配一个新实例(以与之前完全相同的方式),这就是生成断点的地方。 AFAIK(我已经尝试调试一个多小时了),构造函数甚至没有启动。它似乎打破了动态内存分配的 new()
函数。
据我所知,它在 return HeapAlloc(_crtheap, 0, size ? size : 1);
处中断,这是第 54 行或 malloc.c
奇怪的是,当我在 VS2010 之外运行 exe 时,一切正常。该程序没有崩溃,并且继续按预期工作!
最佳答案
不看代码很难诊断,但根据您的描述,这听起来像是堆损坏。我的猜测是 HeapAlloc
检测到损坏并生成了一个 int 3
,这实际上会在调试器中触发一个断点。我的建议是检查所有对象分配/取消分配,并确保您没有踩到尚未分配(或已释放)的内存。
此外,您还提到您正在显式发送 WM_DESTROY
消息。通常,您希望让 Windows 为您生成 WM_DESTROY
消息,方法是调用 DestroyWindow
,或者发送 WM_CLOSE
到窗口并让 DefWindowProc
为您调用 DestroyWindow
。这可能与您的问题无关,仅供引用。
关于c++ - Windows 已生成断点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8089188/