调用glfwWindowShouldClose(window)抛出异常,原因是什么?
问题排查与修复
错误原因分析
你的代码里存在两个核心问题,直接导致glfwWindowShouldClose(window)调用出错:
- OpenGL版本号设置错误:连续两次调用
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3),漏掉了次版本号的设置。GLFW需要同时指定主版本(MAJOR)和次版本(MINOR)才能正确创建对应版本的OpenGL上下文,缺少次版本会导致窗口创建失败,返回NULL指针,后续操作空指针自然会崩溃。 - 未检查窗口创建状态:
glfwCreateWindow可能因版本不兼容、驱动不支持等原因返回NULL,你没有做任何判断就直接使用这个指针,这是典型的空指针访问错误。
另外还有一个必要步骤你没做:创建OpenGL上下文后需要初始化GLAD,否则后续任何OpenGL函数调用都会失效。
修复后的代码
#include <iostream> #include <glad/glad.h> #include <GLFW/glfw3.h> int main() { // 初始化GLFW并检查状态 if (!glfwInit()) { std::cerr << "GLFW初始化失败" << std::endl; return -1; } // 正确设置OpenGL 3.3核心模式 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); // 修正为次版本号设置 glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 创建窗口并检查是否成功 GLFWwindow* window = glfwCreateWindow(640, 480, "teste", NULL, NULL); if (!window) { std::cerr << "窗口创建失败" << std::endl; glfwTerminate(); // 失败时需终止GLFW释放资源 return -1; } // 设置当前OpenGL上下文 glfwMakeContextCurrent(window); // 初始化GLAD(必须在上下文设置后调用) if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { std::cerr << "GLAD初始化失败" << std::endl; glfwDestroyWindow(window); glfwTerminate(); return -1; } // 主循环 while (!glfwWindowShouldClose(window)) { glfwPollEvents(); // 基础渲染操作:清屏+交换缓冲区 glClear(GL_COLOR_BUFFER_BIT); glfwSwapBuffers(window); } // 清理资源 glfwDestroyWindow(window); glfwTerminate(); return 0; }
关键修改说明
- 把第二个
GLFW_CONTEXT_VERSION_MAJOR改为GLFW_CONTEXT_VERSION_MINOR,明确指定OpenGL 3.3版本,确保GLFW能创建符合要求的上下文。 - 增加
glfwInit()、glfwCreateWindow()、gladLoadGLLoader()的状态检查,一旦失败就输出错误并清理资源退出,彻底避免空指针访问问题。 - 添加
glClear和glfwSwapBuffers调用,这是窗口渲染的基础步骤,缺少的话窗口会显示黑屏或无响应。
内容的提问来源于stack exchange,提问作者Matheus Yan
相关产品推荐
相关产品推荐

