C++ 和 Box2D 物理:退出时崩溃
C++ and Box2D physics: Crash while quitting
目前我正在制作自己的 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
}
}
我的猜测是,如果我尝试关闭应用程序,body-contacts 首先被删除,然后程序再循环一次到 for 循环,然后行 ce = body->GetContactList()
将 return 错误,因为未定义 body,对吗?
如果是真的,如果 ce 不为空,我该如何检查 for-loop,因为当游戏崩溃时 ce 的值为:0xfeeefeee {other=???联系方式=???上一个=??? ...}.
因此,ce 有这个奇怪的值 c 在一行之后也有一个奇怪的值:0x07932d78 {m_type=b2_dynamicBody | -17891604 (-17891602) m_flags=65262 m_islandIndex=-17891602 ...}
您必须注意边缘条件:列表中最后一个有效的 b2ContactEdge* ce 没有初始化的 "next" 成员。
"next" 在您列表的最后一个 ce 处有一个无效值 0xFEEEFEF2。
我建议您将此构造函数添加到您的 b2ContactEdge class:
b2ContactEdge() { next = NULL; }
目前我正在制作自己的 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
}
}
我的猜测是,如果我尝试关闭应用程序,body-contacts 首先被删除,然后程序再循环一次到 for 循环,然后行 ce = body->GetContactList()
将 return 错误,因为未定义 body,对吗?
如果是真的,如果 ce 不为空,我该如何检查 for-loop,因为当游戏崩溃时 ce 的值为:0xfeeefeee {other=???联系方式=???上一个=??? ...}.
因此,ce 有这个奇怪的值 c 在一行之后也有一个奇怪的值:0x07932d78 {m_type=b2_dynamicBody | -17891604 (-17891602) m_flags=65262 m_islandIndex=-17891602 ...}
您必须注意边缘条件:列表中最后一个有效的 b2ContactEdge* ce 没有初始化的 "next" 成员。
"next" 在您列表的最后一个 ce 处有一个无效值 0xFEEEFEF2。
我建议您将此构造函数添加到您的 b2ContactEdge class:
b2ContactEdge() { next = NULL; }