在 C++ 中使用 Box2D 物理退出游戏时出现访问冲突错误

问题描述 投票:0回答:1

我目前正在使用 Box2D 物理开发自己的 C++ 游戏。但是,当我尝试退出游戏时,遇到访问冲突错误并显示以下消息:

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

错误似乎发生在以下代码片段中的

b2Contact* c = ce->contact;
行:

for (b2ContactEdge* ce = body->GetContactList(); ce != nullptr; ce = ce->next) {
    // Value of "ce" crash: 0xfeeefeee {other=??? contact=??? prev=??? ...}

    b2Contact* c = ce->contact;
    // Value of "c" at crash: 0x07932d78 {m_type=b2_dynamicBody | -17891604 (-17891602) m_flags=65262 m_islandIndex=-17891602 ...} 
    
    if (c->IsTouching()) {
        // something
    }
 }

我猜想当试图关闭应用程序时,在程序循环回到 for 循环之前,body 联系人被删除,导致错误,因为 body 不再被定义。它是否正确?如果是这样,如果

ce
不为空,我如何在 for 循环中检查?

c++ game-physics game-development box2d
1个回答
1
投票

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

“下一个”在列表的最后一个位置有一个无效值 0xFEEEFEF2。

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

b2ContactEdge() { next = NULL; }
© www.soinside.com 2019 - 2024. All rights reserved.