Я впадал в это время от времени, пытаясь играть с GLUT. Я перепробовал все, что мог, включая выход IIRC glutMainLoop
через исключение, перехваченное в основной функции, но ...
При использовании glutMainLoop
Мое решение заключалось в следующем: создайте глобальный Context
объект, который будет владельцем всех ваших ресурсов, и освободите эти ресурсы в деструкторе.
Этот глобальный Context
деструктор объекта будет вызван сразу после выхода из основного.
Важно Context
- это глобальная переменная, а не переменная, объявленная в основной функции, потому что по причине, которая все еще ускользает от меня (я все еще не вижу интереса к этому варианту реализации), glutMainLoop не будет вернуться.
В моей Linux-системе (Ubuntu) деструктор вызывается правильно. Я полагаю, что это должно работать одинаково и на Windows и MacOS.
Обратите внимание, что это C ++ версия решения atexit()
Франциско Сото, без возможных ограничений.
Использование glutMainLoopEvent
Очевидно, в некоторых реализациях есть glutMainLoopEvent, который можно использовать вместо вызова glutMainLoop.
http://openglut.sourceforge.net/group__mainloop.html#ga1
glutMainLoopEvent
разрешит только ожидающие события, а затем вернет. Таким образом, вы должны предоставить цикл событий (конструкция for(;;)
) вокруг вызова к glutMainLoopEvent
, но таким образом вы можете работать с GLUT и по-прежнему иметь контроль над циклом событий и освобождать свои ресурсы при необходимости.