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);
myTest
是Test*
类型,而你这里取的是指针的地址,也就是说&myTest
是类型Test**
。 myTest
指针本身是一个局部变量,一旦超出作用域就会失效。实际上,这意味着您将指向 堆栈中某个随机位置的指针 传递给 glfwSetWindowUserPointer
,当您稍后检索它并取消引用它时,您会得到未定义的行为。
只需将 ponter 传递给您的对象:
glfwSetWindowUserPointer(GLFWwin, myTest);
当我尝试使用 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);
myTest
是Test*
类型,而你这里取的是指针的地址,也就是说&myTest
是类型Test**
。 myTest
指针本身是一个局部变量,一旦超出作用域就会失效。实际上,这意味着您将指向 堆栈中某个随机位置的指针 传递给 glfwSetWindowUserPointer
,当您稍后检索它并取消引用它时,您会得到未定义的行为。
只需将 ponter 传递给您的对象:
glfwSetWindowUserPointer(GLFWwin, myTest);