glDeleteBuffers () падает при вызове деструктора

Как знают пользователи Qt, использование любых расширений OpenGL может быть довольно проблематичным. Я сделал так, чтобы он расширял класс QGLFunctions следующим образом:

 class Object3D : protected QGLFunctions{
...
}

Чтобы Object3D функционировал правильно, чтобы он мог вызывать такие функции, как glGenBuffer () и т. Д., Необходимо вызвать

initializeGLFunctions(glWidget->context());

ПОСЛЕ QGLWidget был создан, иначе он просто завершит работу приложения, когда оно использует какие-либо функции расширения. Хотя я, наконец, могу вызывать «glGenBuffer ()» и другие во время существования Object3D, похоже, что происходит сбой при вызове ~ Object3D (), который содержит вызов «glDeleteBuffer ()». Я уверен, что именно этот вызов вызывает сбой приложения.

Кто-нибудь знает, как решить эту проблему? Я подозреваю, что это потому, что QGLWidget удаляется первым перед Object3D, и поэтому контекст QGLWidget исчез. Если это так, как я могу убедиться, что QGLWidget удален последним, поскольку QGLWidget добавлен в QMainWindow, который просто удаляет его дочерние элементы в порядке их добавления?

4

Решение

Общее правило, если вы не можете гарантия что объект OpenGL RAII будет уничтожен, пока контекст еще существует, тогда не помещайте объекты OpenGL в классы RAII C ++. Управляйте временем жизни объектов OpenGL другими способами.

Это ваш код (который вы забыли показать нам); Только вы можете решить, где или как управлять уничтожением классов. Вам нужна какая-то система для управления вашими объектами, которая будет гарантировать, что вещи будут уничтожены (и созданы) в правильном порядке.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector