目前,我正在制作自己的C ++游戏,为此,我正在使用Box2D物理。
如果我尝试退出游戏,则会向我输出错误:

NinjaPlatformer.exe中的0x003A2AE4发生异常错误:0xC0000005:
在位置0xFEEEFEF2读取时发生访问冲突

b2Contact* c = ce->contact;行中

这是包装代码:

for (b2ContactEdge* ce = body->GetContactList(); ce != nullptr; ce = ce->next) {
    b2Contact* c = ce->contact;
    if (c->IsTouching()) {
        // something
    }
 }


我的猜测是,如果我尝试关闭该应用程序,则首先删除主体联系人,然后该程序再循环一个for循环,然后ce = body->GetContactList()行将返回错误,因为未定义主体,这是正确的吗?

如果它为真,那么我如何在for循环中检查ce是否为空,因为当游戏崩溃时ce的值为:0xfeeefeee {other = ???联系人= ??? prev = ??? ...}。

结果,ce具有这个奇怪的值c后来又有一个奇怪的值:0x07932d78 {m_type = b2_dynamicBody | -17891604(-17891602)m_flags = 65262 m_islandIndex = -17891602 ...}

最佳答案

您必须注意边缘条件:列表中最后一个有效的b2ContactEdge * ce没有初始化的“ next”成员。

“下一个”在列表中的最后一个ce处具有无效值0xFEEEFEF2。

我建议您将此构造函数添加到b2ContactEdge类中:

b2ContactEdge() { next = NULL; }

关于c++ - C++和Box2D物理:退出时崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35959938/

10-13 08:10