在渲染器类的析构函数中,我想删除与形状关联的缓冲区/顶点数组对象。我在初始化后将这两个(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()
获取错误集,这会导致其自身的段错误。我可以不在析构函数中调用它吗?
glfwterminate() 在删除向量数组/缓冲区之前。必须确保在退出之前释放使用 opengl 函数的对象。一切都很好:)