我在Visual Studio Express 2010下用C ++编写OpenGl程序时遇到了一个奇怪的问题
我用的是:Windows 7 64bit,OpenGl 4.x
我的合作伙伴使用:Windows XP 32位,Visual Studio Express 2010,OpenGl 2.x
到目前为止,我们只为我们的模型绘制了顶点,它在两个系统中都能正常工作(我知道,我知道:已弃用,但我们仍然是初学者)。现在他包含一个lib来导入3d网格并制作动画。对他来说一切正常,但我得到了
Ant Simulation.exe中0x0055f838处的第一次机会异常:0xC0000005:访问冲突读取位置0x00bb0000。
Ant Simulation.exe中0x0055f838处的未处理异常:0xC0000005:访问冲突读取位置0x00bb0000。
使用调试器,我将问题追踪到行
(4,8 GL_QUADS,0,N_DATA);
我尝试捕获代码,但没有触发任何内容。奇怪的是,昨天我可以用调试器重复这一行2-3次直到它崩溃,今天它直接崩溃了。我昨天检查了 n_data 每次都是一样的。如果我在Windows中执行* .exe,它会崩溃(下面的错误代码)。当我的伴侣发给我他的* .exe时,它通常不起作用,但有一次我可以启动它。我在其他窗口上重现了错误。我们试过Linux 64bit并没有问题。我尝试在兼容模式下运行它,但问题保持不变(仍然崩溃)。
不确定我是否理解正确。有一个例外我无法捕获,但会杀死应用程序 - 但为什么其他系统没有这个例外的问题?
我尝试按照链接中描述的方式解决它,但似乎在VS Express中我没有菜单抛出第一次机会异常。我会尝试获取VS 2012,但我仍然想知道:这是一个非常好的Windows事物还是我的代码出现问题会导致崩溃(如链接中的一条评论所示)?我也非常感谢对实际情况的解释......
运行* .exe时出现的错误:
问题事件名称:APPCRASH
应用程序名称:Ant Simulation.exe
应用版本:0.0.0.0
申请时间戳:511d99a3
故障模块名称:StackHash_0a9e
故障模块版本:0.0.0.0
故障模块时间戳:00000000
例外代码:c0000005
异常偏移:0037f278
操作系统版本:6.1.7601.2.1.0.256.48
区域ID:1031
附加信息1:0a9e
附加信息2:0a9e372d3b4ad19135b953a78882e789
附加信息3:0a9e
附加信息4:0a9e372d3b4ad19135b953a78882e789
答案 0 :(得分:4)
Windows中的“第一次机会异常”不是C ++异常,它意味着运行时系统检测到程序的非法行为,例如取消引用无效指针。实际上,“访问冲突读取位置0x00bb0000”非常表明这就是正在发生的事情。
取消引用无效指针不一定会在不同系统上甚至在同一台机器上的不同运行中导致相同的行为:有关详细信息,请参阅C code crashes in Windows, but not in Linux之类的问题。在这种情况下,故障似乎发生在GL实现中,但这可能是由于早期的应用程序代码导致了错误的信息。
检查所有已启用的顶点数组是否至少具有n_data
个元素。 (要特别小心,确保它们不只有n_data - 1
个元素,并且n_data
保存您期望的值。)您还应检查先前传递给GL函数的任何指针是否有效。还有更多的GL状态可以检查,但这是我的第一个猜测。