c++ - Windows 已生成断点

标签 c++ visual-studio-2010 winapi

我在 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/

相关文章:

c++ - 如何在windows中直接在屏幕上绘图?

c++ - 在 C++ 项目中设置 R (C api)

c++ - 具有详尽训练数据的神经网络 : Minimal, 开源示例?

visual-studio-2010 - 在页眉/页脚之外的 RDLC 的每一页上重复元素

c# - 什么 R# 设置正在重新格式化这一行?

windows - CreateWindowEx的lpClassName参数怎么可选

c++ - 使用控件绘制窗口

c++ - 我可以定义一个结构,其对象将始终位于单独的缓存行中吗

c++ - 关闭其存在依赖于与 C++ 中的 .close() 语句相同的 bool 的文件流时出错

c# - 如何运行Kinect SDK 中提供的C# SkeletalViewer 示例?