2

我正在使用 box2d 并且有一些我正在从世界时间步长中销毁的主体(已将它们标记为将它们标记为要删除),但由于获取引用这些主体的联系人,联系人侦听器仍然崩溃。

这是在联系侦听器的 presolve 和 begin 联系方法中所做的:

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 并且确实发现联系人正文用户数据是已释放的对象(发送到已释放实例的消息)。检查 Box2d 源我发现当身体被破坏时接触确实被破坏了。我将不得不通过更多的 Box2D 代码,或者只是更改我的代码以以某种方式解决听众收到的这些神秘联系。

当我测试将主体的用户数据设置为空(同样,在世界步骤之外)时,我在此主体的联系人侦听器中收到的联系人(当我在联系人侦听器中检查时)没有空用户数据。

4

2 回答 2

1

据我所知,box2d 主体的破坏与所有这些无关。GetUserData 返回您在创建正文时传入的任何内容,这可能是垃圾。你吃掉了它或者你传入了null。如果你能提供创建和销毁尸体的代码,我可能会告诉你更多。

如果正文无效,则程序可能会崩溃:

contact->GetFixtureA()->GetBody();

或bodyB部分。

于 2013-07-30T09:27:25.260 回答
1

问题是我创建了两个相同的主体,我不知道,并将它们都传递给相同的用户数据。当第一个主体与相应的用户数据(和包含对象)一起被销毁时,第二个主体仍在创建联系点,并且由于与主体关联的用户数据已被释放,我遇到了所描述的问题。

在删除之前将 NULL 设置为主体的用户数据似乎不起作用,因为当崩溃发生时,调试器实际上向我显示了第二个没有将其用户数据设置为 NULL 的主体。我花了这么长时间才找到它的原因是因为代码在容器对象中具有继承结构,这使得很难发现正在创建两个主体。

事实证明这是一个错误,仅使用我发布的代码无法解决,因此尽管 Tomasz 和 Pavel 的答案并没有让我解决问题,但我必须感谢他们花时间至少尝试提供帮助. 谢谢你俩。

于 2013-08-01T02:52:05.980 回答