GLFW setUserPointer/getUserPointer发送/访问类崩溃
GLFW setUserPointer / getUserPointer sending / accessing class crash
当我尝试使用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);
相关文章:
- 使用 g++7 构建的代码在访问未对齐的内存时崩溃
- 访问提升:shared_ptr 主范围外崩溃,断言失败:px != 0.指针的正确用法是什么?
- 当键是虚拟继承中涉及的基类指针时,对 std::unordered_map 项的访问崩溃
- 在目标计算机上访问 POSIX 信号灯时出现可执行文件崩溃(SEGV_MAPERR)
- 无法访问的代码如何导致我的程序崩溃?
- 使用向量的函数崩溃,调试器说访问冲突读取位置
- 我的单例中的数组在离开函数后没有保留信息,然后在尝试再次访问信息时崩溃
- 为什么 CUDA 在访问类成员时崩溃?
- 将多面体转换为nef(违反访问)时,与CGAL崩溃
- Windows C++程序中的访问冲突是否总是立即崩溃
- libtorrent和tcp ::受体在Windows上崩溃并违反访问
- 程序在访问shared_ptr持有QString时崩溃
- 访问使用 def 文件导出的静态变量时崩溃
- 程序在尝试创建和访问二维矢量时崩溃
- C 程序在出口时崩溃,内存中的访问违规
- 简单的Logger类VSNPrintf正在随着读取访问违规行为而崩溃
- Dx11 访问 XMMATRIX 时崩溃
- 如何调试C++非托管代码中的较低级别文件访问异常/崩溃
- MEMCPY 后崩溃:访问冲突读取位置
- c++, WIN32, WndProc到成员函数崩溃(访问冲突0x88)