我目前正在使用 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 循环中检查?
您必须关心边缘条件:列表中最后一个有效的 b2ContactEdge* ce 没有初始化的“下一个”成员。
“下一个”在列表的最后一个位置有一个无效值 0xFEEEFEF2。
我建议您将此构造函数添加到您的 b2ContactEdge 类中:
b2ContactEdge() { next = NULL; }