shared_ptr 析构函数中的段错误

Segfault in shared_ptr destructor

上下文

我正在尝试制作一个小型游戏引擎,目前我正在开发一个实体组件系统。我有一组指向模型对象的共享指针(从 OBJ 文件读取的 3D 模型)。然后,我使用一个模型组件将模型与实体连接起来,该组件本质上具有两个数组的结构,一个具有实体句柄,另一个具有模型索引。索引指的是组件中向量的元素,具有指向模型的实际共享指针。我这样做是为了不必在动态分配的内存中构造共享指针。

我有两个用于模型的 classes,base class Model 和一个专门的 subclass UntexturedModel,它将顶点位置数据存储在一个更有效的方式。为了进行测试,我现在使用两个实体并为第一个实体分配一个 Model 对象和另一个 UntexturedModel 对象(以确保这两个实体在该系统中都能正常运行)。

问题

实际的组件行为按预期工作,模型与实体正确连接并在渲染时检索。但是当 main 函数终止时,出现段错误。我使用 Valgrind 试图找出问题所在,它说 std::default_delete<Model>::operator()(Model*).

有一个无效跳转

我已经尝试创建一个完全相同类型的单独共享指针并立即重置它,据我所知应该会触发相同的问题,但它顺利进行。经过几次类似的测试(仅使用基础 class 模型,两个实体仅使用一个模型,添加一个调用 ~Model 然后删除指针的自定义删除器)我相当确定问题只在 main 函数终止后发生。

我可以添加任何代码片段,只问哪些。

问题似乎是试图在 Model 函数之后的 Model 析构函数中删除 OpenGL 对象(VAO 和 VBO),因为此时 OpenGL 上下文已经终止。通过将模型组件管理器放在一个唯一的指针中并在主循环完成后但在 OpenGL 上下文终止之前重置它来强制销毁导致不再有无效跳转。

感谢@Swift 为我指明了正确的方向。