我正在使用box2d,并且我正在摧毁世界时间步骤(标记他们标记它们以便删除)但是由于获取引用这些实体的联系人,联系人监听器仍在崩溃。
这是在联系人监听器的预解决方案和开始联系方法中所做的:
const b2Body* bodyA = contact->GetFixtureA()->GetBody();
const b2Body* bodyB = contact->GetFixtureB()->GetBody();
Object * objectA = (Object*)bodyA->GetUserData();
Object * objectB = (Object*)bodyB->GetUserData();
objectA或objectB实际上是指向无意义的指针,因为该对象已被删除(在世界时间步之外)。似乎正在创建不良联系人或者不再存在的联系人仍然存在。
更新
我已经将代码更改为世界步骤以确保并验证正确的正文被销毁(以及其容器的正文),并发现联系人侦听器仍在尝试处理不应存在的联系人。我碰巧在iOS / Xcode上启用NSZombie,确实发现联系人身体userdata是解除分配的对象(发送到解除分配的实例的消息)。检查Box2d源我发现当身体被破坏时触点确实被破坏了。我将不得不通过更多的Box2D代码或只是改变我的代码,以某种方式解决听众收到的这些神秘的联系。
当我测试将body的userdata设置为null(同样,在世界步骤之外)时,我在本机构的联系人侦听器中收到的联系人(当我在联系人侦听器中检查它时)没有null userdata。
答案 0 :(得分:1)
从我看到的box2d身体的破坏与所有这一切无关。 GetUserData返回您在创建正文时传入的内容,这可能是垃圾。您已经删除了它,或者您传入了null。如果你能提供创建和销毁尸体的代码,我可能会告诉你更多。
如果身体无效,那么程序可能会崩溃:
contact->GetFixtureA()->GetBody();
或bodyB部分。
答案 1 :(得分:1)
问题是我创建了两个相同的实体,我不知道,并将它们传递给相同的用户数据。当第一个主体与相应的用户数据(以及包含对象)一起被销毁时,第二个主体仍在创建接触点,并且由于与主体关联的用户数据已被释放,因此我遇到了所描述的问题。
在删除之前将NULL设置为正文的用户数据似乎不起作用,因为当崩溃发生时,调试器实际上向我展示了第二个没有将其用户数据设置为NULL的主体。我花了这么长时间才找到它的原因是因为代码在容器对象中有一个继承结构,这使得很难发现正在创建两个实体。
事实证明这是一个错误,只有我发布的代码无法解决,所以尽管Tomasz和Pavel的答案并没有引导我解决这个问题,但我必须把它归功于花时间至少试图帮助。谢谢你们两个。