GLFW setUserPointer / getUserPointer 发送/访问 class 崩溃

GLFW setUserPointer / getUserPointer sending / accessing class crash

当我尝试使用 glfwSetUserPointer / glfwGetUserPointer 发送和访问 class 时,我打印了随机值并且应用程序崩溃了。我可以用同样的方式成功发送一个结构,但我想发送一个 class,这样我就不必管理多个东西。我认为 static_cast 不工作,如果是这样,用什么替代品?回调包括测试 class 声明。

class Test
{
public:
    Test() { ; }

    string aString;
};

GLFWwindow *GLFWwin;
GLFWwin = glfwCreateWindow(1920, 1080, "myProj", 0, 0);

auto myTest = new Test();
myTest->aString = "str";
cout << "myTest->aString = " << myTest->aString << endl; //prints "str"

glfwSetWindowUserPointer(GLFWwin, &myTest);
glfwSetCursorPosCallback(GLFWwin, myCursorPosCallback);

do
{

    glClear(GL_COLOR_BUFFER_BIT);
    glfwSwapBuffers(GLFWwin);
    glfwPollEvents();
}

while (glfwWindowShouldClose(GLFWwin) == 0);


void myCursorPosCallback(GLFWwindow *GLFWwin, double xPos, double yPos)
{
    auto *myTest = static_cast<Test*>(glfwGetWindowUserPointer(GLFWwin));
    cout << "myTest->aString = " << myTest->aString << endl; //prints random vals then crash
}

没有传递您创建的Test()对象的地址作为window用户指针:

auto myTest = new Test();
glfwSetWindowUserPointer(GLFWwin, &myTest);

myTestTest*类型,而你这里取的是指针的地址,也就是说&myTest是类型Test**myTest 指针本身是一个局部变量,一旦超出作用域就会失效。实际上,这意味着您将指向 堆栈中某个随机位置的指针 传递给 glfwSetWindowUserPointer,当您稍后检索它并取消引用它时,您会得到未定义的行为。

只需将 ponter 传递给您的对象:

glfwSetWindowUserPointer(GLFWwin, myTest);