我正在尝试制作一个小型游戏引擎,目前我正在开发一个实体组件系统。我有一个模型对象的共享指针数组(从OBJ文件读取的3D模型)。然后,我使用模型组件将模型与实体连接,模型组件基本上具有两个数组的结构,一个具有实体句柄,另一个具有模型索引。索引引用组件中向量的元素,其中包含指向模型的实际共享指针。我这样做不必在动态分配的内存中构造共享指针。
我有两个模型类,基类Model
和一个专门的子类UntexturedModel
,它以更有效的方式存储顶点位置数据。为了进行测试,我现在使用两个实体,并为第一个实体分配一个Model
对象和另一个UntexturedModel
对象(以确保这两个实体在这个系统中正常运行)。
实际组件行为按预期工作,模型与实体正确连接并在呈现时检索。但是当main
函数终止时,会出现段错误。我使用Valgrind试图找出问题所在,并且说std::default_delete<Model>::operator()(Model*)
有一个无效跳转。
我尝试创建一个完全相同类型的单独共享指针并立即重置它,AFAIK应该触发相同的问题,但它顺利通过。经过几次类似的测试(仅使用基类模型,两个实体只使用一个模型,添加一个调用~Model
的自定义删除器然后删除指针)我相当确定问题只发生在{ {1}}函数终止。
我可以添加任何代码片段,只需询问哪些代码片段。
答案 0 :(得分:0)
问题似乎是在Model
函数之后尝试删除main
析构函数中的OpenGL对象(VAO和VBO),因为此时OpenGL上下文已经终止。通过将模型组件管理器放在一个唯一的指针中并在主循环完成之后但在OpenGL上下文终止之前重置它导致不再无效的跳转来强制销毁。
感谢@Swift指出我正确的方向。