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

GLFW setUserPointer / getUserPointer sending / accessing class crash

本文关键字:崩溃 访问 getUserPointer setUserPointer GLFW 发送      更新时间:2023-10-16

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

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()对象的地址作为窗口用户指针:

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

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

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

glfwSetWindowUserPointer(GLFWwin, myTest);