OpenGL Window类全屏切换触发访问违规崩溃问题排查
问题分析与排查方案
0xC0000005访问违规本质是无效内存访问,结合你的场景(单独用Window类正常,引入Camera/CameraController后F11触发全屏时在glfwGetWindowPos崩溃),核心排查方向集中在窗口指针有效性和跨组件的生命周期/线程冲突上,具体步骤如下:
1. 确认GLFW窗口指针是否悬空/失效
- 先在
Window.cpp第16行调用glfwGetWindowPos前,打印窗口指针(比如m_Window)的地址,对比Window初始化时的指针地址:
如果指针是// 调用glfwGetWindowPos前添加打印 std::cout << "Current window ptr: " << m_Window << std::endl;NULL或者和初始化时地址不一致,说明窗口指针被意外修改/释放了。 - 排查全屏切换逻辑:如果你的全屏实现是销毁原窗口再重建,要确保所有持有窗口指针的地方(包括Camera/CameraController)都更新为新指针;如果用GLFW原生的
glfwSetWindowMonitor切换全屏,确认调用时窗口指针仍有效。
2. 检查Camera/CameraController对Window的引用方式
- 如果你在Camera/CameraController中持有Window的裸指针,要确认Window实例的生命周期长于Camera/CameraController:比如Window被
std::unique_ptr管理时,是否在Camera还持有指针的情况下就被销毁,导致悬空指针。 - 建议改用弱引用或者确保Camera/CameraController的生命周期绑定到Window实例,避免出现指针悬空。
3. 排查线程安全问题
GLFW所有API必须在主线程调用,若Camera/CameraController的逻辑(比如输入监听、状态更新)跑到了子线程,触发全屏切换时在子线程调用glfwGetWindowPos,必然会触发访问违规:
- 确认Window类的全屏切换逻辑、所有GLFW相关调用都在主线程执行;
- 检查Camera/CameraController是否开启了子线程处理输入,若有,需把窗口操作逻辑切回主线程。
4. 检查回调函数冲突
如果Camera/CameraController注册了GLFW的窗口回调(比如glfwSetWindowPosCallback、glfwSetWindowSizeCallback),可能和Window类的回调逻辑冲突,导致窗口状态异常:
- 排查是否存在回调函数覆盖、重复注册的情况,确保窗口状态变更时的回调逻辑不会干扰窗口指针的有效性。
内容的提问来源于stack exchange,提问作者Zoro
相关产品推荐
相关产品推荐

