Почему вызов glfwCreateWindow, затем glfwTerminate, затем glfwInit вызывает segfault?

Во время игры с многократной инициализацией и завершением GLFW, Я столкнулся с segfault. Вот минимальная программа на C ++, которая иллюстрирует мою проблему:

#include <iostream>

#include <GLFW/glfw3.h>

int main() {
glfwInit();
// glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
glfwCreateWindow(1, 1, "", NULL, NULL);
glfwTerminate();
std::cout << "before" << std::endl;
glfwInit();
std::cout << "after" << std::endl;
glfwTerminate();
}

Если я раскомментирую звонок glfwWindowHint, программа работает нормально:

$ g++ glfw_segfault.cpp `pkg-config --static --libs glfw3`
$ ./a.out
before
after

Тем не менее, без этого вызова я получаю segfault:

$ g++ glfw_segfault.cpp `pkg-config --static --libs glfw3`
$ ./a.out
before
Segmentation fault (core dumped)

Досадно, что segfault происходит только в некоторых случаях, когда я запускаю вышеуказанную программу. В других случаях я не получаю segfault, и программа работает точно так, как я ожидал. Я также перевел приведенный выше код на C и не смог воспроизвести ошибку.

Когда я впервые столкнулся с этой проблемой, я использовал Clojure а также ботинок:

#!/usr/bin/env boot

(set-env!
:dependencies
(let [lwjgl-version "3.0.0"]
[['org.lwjgl/lwjgl lwjgl-version]
['org.lwjgl/lwjgl-platform lwjgl-version :classifier "natives-linux"]]))

(import (org.lwjgl.glfw GLFW)
(org.lwjgl.system MemoryUtil))

(defn -main []
(GLFW/glfwInit)
;; (GLFW/glfwWindowHint GLFW/GLFW_CLIENT_API GLFW/GLFW_NO_API)
(GLFW/glfwCreateWindow 1 1 "" MemoryUtil/NULL MemoryUtil/NULL)
(GLFW/glfwTerminate)
(println "before")
(GLFW/glfwInit)
(println "after")
(GLFW/glfwTerminate))

Как и раньше, если я раскомментирую glfwWindowHint звоните, проблем нет

$ chmod +x glfw_segfault
$ ./glfw_segfault
before
after

Если я оставлю вызов, я получу сегфо. Эта программа Clojure создала для меня сегфофт более надежно, чем приведенная выше программа на C ++, но не всегда. В частности, когда я использую интегрированную графику Haswell Intel HD, у меня не возникает ошибка по умолчанию. Тем не менее, когда я использую nvidia-settings Чтобы переключиться на NVIDIA GeForce GT 750M с драйвером NVIDIA 367.35, я всегда получаю ошибку segfault.

Это ошибка в GLFW, или я просто неправильно ее использую? В последнее мне трудно поверить, потому что согласно документации для glfwTerminate, поддерживается инициализация и завершение библиотеки несколько раз:

Как только эта функция вызвана, вы должны снова вызвать glfwInit успешно, прежде чем вы сможете использовать большинство функций GLFW.

Мне кажется, что проблема как-то связана с GLFW_CLIENT_API подсказка окна, но я не могу понять, что это может быть. Поскольку это похоже на ошибку, я открыл вопрос на GitHub.

0

Решение

Задача ещё не решена.

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

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

По вопросам рекламы [email protected]