Сейчас я изучаю OpenGL и написал простую оболочку для стандартных процедур, таких как инициализация glfw, создание шейдеров, загрузка моделей и т. Д. Я использую Ubuntu 16.04 с g ++ 5.4.0.Когда я проверяю свою программу, используя valgrind --tool = memchek, она показывает много ошибок (30K +), таких как
"Invalid write/read of size 4" at ...by 0x50CC471: ??? (in
/usr/lib/x86_64-linux-gnu/libglfw.so.3.1)
==14520== by 0x50C9A06: ??? (in /usr/lib/x86_64-linux-
gnu/libglfw.so.3.1)
==14520== by 0x50C4B69: glfwCreateWindow (in /usr/lib/x86_64-linux-
gnu/libglfw.so.3.1)
==14520== by 0x403EC1: Engine::Engine() (in
/home/paul/programming/openGL/main)
Эта конкретная ошибка была показана, когда я использовал valgrind удаленно с gdb, это была ошибка после достиженияпервая точка останова, конструктор класса Engine был вызван там.Даже там такие ошибки случаются.Зачем?Я читал, что такие ошибки возможны в результате неинициализированных переменных, но тогда почему в трассировке стека присутствуют библиотеки glfw?Есть ли у них такие ошибки?Код конструктора класса Engine:
// setEventHandling();
//default values for width and height
window_width = 1280;
window_height = 720;
//default shader filenames
int init_result = glfwInit();
if (!init_result)
{
cout << "Failed to initialize GLFW" << endl;
}
//major required version of the opengl
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
//setting of the profile for which context is created
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
window = glfwCreateWindow(window_width, window_height, "OpenGL", NULL,
NULL);
if (window == NULL)
{
cout << "Failed to create window" << endl;
glfwTerminate();
}
glfwMakeContextCurrent(window);
glewExperimental = true;
if (glewInit() != GLEW_OK)
{
cout << "Failed to initialize GLEW" << endl;
}
glfwGetFramebufferSize(window, &window_width, &window_height);
glViewport(0, 0, window_width, window_height);
glfwSetKeyCallback(this->window,
CallbackInterface::callback_dispatch);
Я не вижу здесь неинициализированных переменных.Так почему я вижу эти ошибки?Кстати, раньше я использовал SFML для кодирования графики, и ошибки были такими же.
РЕДАКТИРОВАТЬ
Некоторые люди в комментариях говорили, что проблема на самом деле, потому что я использую ООП, этоплохо использовать его с OpenGL.Ну, я протестировал самый простой код openGL, который создает только одно окно ...
// GLEW
#define GLEW_STATIC
#include <GL/glew.h>
// GLFW
#include <GLFW/glfw3.h>
// Function prototypes
void key_callback(GLFWwindow* window, int key, int scancode, int
action, int mode);
// Window dimensions
const GLuint WIDTH = 800, HEIGHT = 600;
// The MAIN function, from here we start the application and run the
game loop
int main()
{
std::cout << "Starting GLFW context, OpenGL 3.3" << std::endl;
// Init GLFW
glfwInit();
// Set all the required options for GLFW
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
// Create a GLFWwindow object that we can use for GLFW's functions
GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "LearnOpenGL",
nullptr, nullptr);
if (window == nullptr)
{
std::cout << "Failed to create GLFW window" << std::endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
// Set the required callback functions
glfwSetKeyCallback(window, key_callback);
// Set this to true so GLEW knows to use a modern approach to
retrieving function pointers and extensions
glewExperimental = GL_TRUE;
// Initialize GLEW to setup the OpenGL Function pointers
if (glewInit() != GLEW_OK)
{
std::cout << "Failed to initialize GLEW" << std::endl;
return -1;
}
// Define the viewport dimensions
int width, height;
glfwGetFramebufferSize(window, &width, &height);
glViewport(0, 0, width, height);
// Game loop
while (!glfwWindowShouldClose(window))
{
// Check if any events have been activiated (key pressed, mouse
moved etc.) and call corresponding response functions
glfwPollEvents();
// Render
// Clear the colorbuffer
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// Swap the screen buffers
glfwSwapBuffers(window);
}
// Terminate GLFW, clearing any resources allocated by GLFW.
glfwTerminate();
return 0;
}
// Is called whenever a key is pressed/released via GLFW
void key_callback(GLFWwindow* window, int key, int scancode, int
action, int mode)
{
std::cout << key << std::endl;
if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
glfwSetWindowShouldClose(window, GL_TRUE);
}
Вывод Valgrind составил 26 КБ!Большинство из них являются недопустимыми для чтения / записи размером 4/8
==11533== HEAP SUMMARY:
==11533== in use at exit: 114,489 bytes in 669 blocks
==11533== total heap usage: 12,989 allocs, 12,320 frees, 3,704,593
bytes
allocated
==11533==
==11533== LEAK SUMMARY:
==11533== definitely lost: 72 bytes in 1 blocks
==11533== indirectly lost: 0 bytes in 0 blocks
==11533== possibly lost: 0 bytes in 0 blocks
==11533== still reachable: 114,417 bytes in 668 blocks
==11533== suppressed: 0 bytes in 0 blocks
==11533== Rerun with --leak-check=full to see details of leaked memory
==11533==
==11533== For counts of detected and suppressed errors, rerun with: -v
==11533== ERROR SUMMARY: 26274 errors from 478 contexts (suppressed: 0
from 0)
, что заставляет меня думать, что в glfw и самом opengl МНОГО ошибок.