You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenGL调用glGenBuffers创建多EBO后程序段错误,疑似变量被意外修改

OpenGL调用glGenBuffers创建多EBO后程序段错误,疑似变量被意外修改

兄弟,我一眼就看出问题出在哪了——你调用glGenBuffers的方式不对,导致内存越界把window指针给冲坏了!

咱们仔细看代码:你声明的EBO是单个unsigned int变量,但当你用glGenBuffers(N_EBOS, &EBO)且N_EBOS >=15时,glGenBuffers会尝试往&EBO指向的内存位置开始,连续写入N_EBOS个buffer ID。可你只给了一个变量的空间啊!这就会越界写入栈上的其他内存区域,刚好把旁边的window指针给覆盖成无效值了,后面调用glfwWindowShouldClose(window)的时候自然就段错误了。

解决方法很简单,分两种情况:

情况1:你确实需要多个EBO

那得先准备一个能装下N_EBOS个ID的数组,比如:

// 如果N_EBOS是编译期常量,用静态数组
unsigned int EBOs[N_EBOS];
// 或者用动态分配(记得最后delete[]释放)
unsigned int* EBOs = new unsigned int[N_EBOS];

然后调用glGenBuffers的时候传数组的地址:

glGenBuffers(N_EBOS, EBOs);

情况2:你其实只需要一个EBO

那直接把第一个参数改成1就行,不用搞什么N_EBOS:

glGenBuffers(1, &EBO);

修改后你的代码片段大概是这样(以多个EBO为例):

int main() {
    GLFWwindow* window = init();

    unsigned int VAO, VBO;
    // 定义数组存储多个EBO ID
    unsigned int EBOs[N_EBOS];

    glGenVertexArrays(1, &VAO);
    glGenBuffers(1, &VBO);
    glGenBuffers(N_EBOS, EBOs); // 这里传数组地址

    //load vertices etc..
    
    while (!glfwWindowShouldClose(window)) {
        glfwSwapBuffers(window);

        // Render stuff...

        glfwPollEvents();
    }

    // 如果用了动态数组,记得释放
    // delete[] EBOs;

    glfwTerminate();

    return 0;
}

本质就是栈内存越界导致的变量污染,这种问题有时候很隐蔽,但只要记住OpenGL这类底层API的参数要求——需要多个对象ID时必须传足够大的数组,就不会踩坑啦!

备注:内容来源于stack exchange,提问作者Cyclone6664

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 11:22:57