OpenGL Glad,glDeleteVertexArrays()、glGetError() 会导致段错误

问题描述 投票:0回答:1

在渲染器类的析构函数中,我想删除与形状关联的缓冲区/顶点数组对象。我在初始化后将这两个(VAO/VBO)保存为成员变量。找到问题所在,这导致了段错误。

来自 lldb 的错误:

stop reason = signal SIGSEGV: invalid address (fault address: 0x7ffff778efc0)

* thread #1, name = 'gulua', stop reason = signal SIGSEGV: invalid address (fault address: 0x7ffff778efc0)
  * frame #0: 0x00007ffff778efc0
    frame #1: 0x00005555555ee595 gulua`GuluaResources::ShapeRenderer::~ShapeRenderer(this=0x0000555555f06f10) at ShapeRenderer.cpp:10:22

注意:仅发生在Linux机器上,Mac机器不会遇到此错误。用 clang 编译。

这里生成缓冲区/顶点数组,称为:

ShapeRenderer::~ShapeRenderer() {
    glDeleteVertexArrays(1, &mVAO);
    glDeleteBuffers(GL_ARRAY_BUFFER, &mVBO);
}

void TriangleRenderer::initShape() {
    glGenVertexArrays(1, &mVAO);
    glGenBuffers(1, &mVBO);


    glBindBuffer(GL_ARRAY_BUFFER, mVBO);
    glBufferData(GL_ARRAY_BUFFER, mVertices.size() * sizeof(mVertices), &mVertices[0], GL_STREAM_DRAW);

    glBindVertexArray(mVAO);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);

    glBindBuffer(GL_ARRAY_BUFFER, 0); 
    glBindVertexArray(0); 
}

尝试四处搜寻此事。怀疑我对数组/缓冲区在生成后如何存储/和/或对 C++ 类销毁感到困惑。

编辑:

尝试使用

glGetError()
获取错误集,这会导致其自身的段错误。我可以不在析构函数中调用它吗?

c++ opengl glad
1个回答
0
投票

glfwterminate() 在删除向量数组/缓冲区之前。必须确保在退出之前释放使用 opengl 函数的对象。一切都很好:)

© www.soinside.com 2019 - 2024. All rights reserved.