代码之家  ›  专栏  ›  技术社区  ›  Lynn

为什么GLFW窗口只有在抽象为唯一指针时才会引发访问冲突?

  •  0
  • Lynn  · 技术社区  · 2 年前

    我正在尝试在静态库中使用GLFW。如果我在库的主要功能(应用程序)中初始化GLFW窗口,它就会工作。但是如果我把它抽象到一个单独的类中,我会得到一个访问冲突错误。我已经将glfw链接到库和可执行文件:

    #include "glad/glad.h"
    #include "glfw3.h"
    #include "Window/Window.h"
    Application::Application() : m_Camera(1.0f, 1.0f, 1.0f, 1.0f) {
        std::unique_ptr<Window> m_Window;
        m_Window = std::unique_ptr<Window>();
    
    }
    
    bool Application::init() {
        m_Window->init();} //access violation 
    

    类窗口:

    bool Window::init() {
        if (!glfwInit()) HZ_CORE_CRITICAL("GLFW FAILED");
        //glfwSetErrorCallback(GLFWErrorCallback);
        m_gWindow = glfwCreateWindow(800, 600, "ALAvery", NULL, NULL);
        if (!m_gWindow) { HZ_CORE_CRITICAL("GLFW WINDOW CREATION FAILED"); return false; }
        glfwMakeContextCurrent(m_gWindow);
        glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
        glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 4);
        glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
        glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
        int status = gladLoadGLLoader((GLADloadproc)glfwGetProcAddress);
        HZ_CORE_ASSERT(status, "Failed to initialize Glad!");
    
    1 回复  |  直到 2 年前
        1
  •  3
  •   KIIV    2 年前

    除了寻找用法示例外,您正在尝试其他一切。

    Application::Application() : m_Camera(1.0f, 1.0f, 1.0f, 1.0f), m_Window{ new Window }
    {
        ;   
    }
    

    当您有:

    Application::Application() : m_Camera(1.0f, 1.0f, 1.0f, 1.0f) {
        std::unique_ptr<Window> m_Window;     // creating a local variable that shadows class m_Window...
        m_Window = std::unique_ptr<Window>(); // copy assigment of empty unique_ptr (std::unique_ptr<Window>() = default construction of unique_ptr)
    }
    

    基本上你们做的和删除那个些行并并没有做任何事情一样。

    由于c++17规范,您还可以使用:

    m_Window = std::make_unique<Window>(); 
    

    或者:

    Application::Application() : m_Camera(1.0f, 1.0f, 1.0f, 1.0f), m_Window{ std::make_unique<Window>() }