Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用iOS中的CreateFixture在Box2D中执行错误访问_C++_Ios_Cocos2d Iphone_Xcode8_Box2d - Fatal编程技术网

C++ 使用iOS中的CreateFixture在Box2D中执行错误访问

C++ 使用iOS中的CreateFixture在Box2D中执行错误访问,c++,ios,cocos2d-iphone,xcode8,box2d,C++,Ios,Cocos2d Iphone,Xcode8,Box2d,5-6年来,我在AppStore上有多个使用Cocos2D和Box2D的游戏。我从来没有遇到过他们撞车的问题。苹果让我更新它们,否则它们将被从应用商店中删除。所以我开始通过更新Cocos2d和Box2d来更新它们。在处理了几个小时的构建错误之后,我已经到了可以进行测试的地步。我在模拟器中对跨越不同操作系统版本的6台设备进行了测试。我还测试了我的iPhone6 10.3。我甚至制作了不同尺寸的屏幕抓图。我上传了一个档案到TestFlight,然后在我的设备上进行了测试。。。。崩溃然后我又回到模拟器

5-6年来,我在AppStore上有多个使用Cocos2D和Box2D的游戏。我从来没有遇到过他们撞车的问题。苹果让我更新它们,否则它们将被从应用商店中删除。所以我开始通过更新Cocos2d和Box2d来更新它们。在处理了几个小时的构建错误之后,我已经到了可以进行测试的地步。我在模拟器中对跨越不同操作系统版本的6台设备进行了测试。我还测试了我的iPhone6 10.3。我甚至制作了不同尺寸的屏幕抓图。我上传了一个档案到TestFlight,然后在我的设备上进行了测试。。。。崩溃然后我又回到模拟器和CRASH上进行测试。现在它每次都在同一点崩溃。我不知道为什么它工作了这么长时间,现在没有任何代码的变化

我在CreateBody上撞车。然后我将所有代码移动到after world->Step,现在它在CreateFixture上崩溃了。我启用了僵尸,但这并没有给我更多的洞察力

游戏开始,它创建了2个b2Body对象和2个b2Fixture对象(一个大环)。还有另一个b2Body&b2Fixture,你可以上下移动(一个飞艇)。目的是让飞艇穿过吊环。环从右向左移动。一旦通过或未通过该环,环零件将被销毁,并创建新环(2个B2Body和2个B2Fixture)。第二个环是发生碰撞的地方。(同样,多年来,从ios 4.3->10开始,它一直工作得很好),但现在尝试用XCode 8更新它不会工作(尽管我测试了几个小时,昨天它工作得很好)

以下是戒指创建代码:(4-5年前我学习Box2D时编写)

如果我注释掉CreateFixture,它运行得非常好。我不能这样做

碰撞发生在b2Body.cpp中:

b2Fixture* b2Body::CreateFixture(const b2FixtureDef* def)
{

...

fixture->Create(allocator, this, def);

...

}
在b2Fixture.cpp中

void b2Fixture::Create(b2BlockAllocator* allocator, b2Body* body, const b2FixtureDef* def)
{

...

m_shape = def->shape->Clone(allocator);

...

}
我有5-6个应用程序使用Box2d和Cocos2d,我不想把它们从应用商店中拿走,但我也不能重新开始。我已经写了一个版本,其中创建发生在world->Step之后,但这没有改变任何东西,仍然崩溃

这是在勾选方法中删除主体的代码:

std::vector<b2Body *>toDestroy;

...

std::vector<b2Body *>::iterator pos2;
    for(pos2 = toDestroy.begin(); pos2 != toDestroy.end(); ++pos2) {
        b2Body *body = *pos2;
        if (body->GetUserData() != NULL) {
            CCSprite *sprite = (CCSprite *) body->GetUserData();
            [self removeChild:sprite cleanup:YES];
        }
        _world->DestroyBody(body);
    }


所以块中的下一个是null,所以它崩溃了。另一个论坛说,一个代码非常相似的人多次试图摧毁同一个物体。我不认为会发生这种情况。

因此,正如保尔·麦肯齐指出的那样,问题在于我摧毁尸体的方式。这本书最初是为Xcode 4.3编写的,现在正在为Xcode 8.3更新。我有一个崩溃问题。我不再了解Box2D了,所以我选择了快速修复方法,销毁固定装置,隐藏精灵,然后在它们离开屏幕后销毁尸体。现在这似乎对我有效,因为我不能花时间用(erase(remove_if())修复它,正确的方法现在就可以了

我之所以回答这个问题,是因为这是勾选方法中的违规代码:

std::vector<b2Body *>::iterator pos2;
for(pos2 = toDestroy.begin(); pos2 != toDestroy.end(); ++pos2) {
    b2Body *body = *pos2;
    if (body->GetUserData() != NULL) {
        CCSprite *sprite = (CCSprite *) body->GetUserData();
        [self removeChild:sprite cleanup:YES];
    }
    _world->DestroyBody(body);
}
std::vector::iterator pos2;
for(pos2=toDestroy.begin();pos2!=toDestroy.end();+pos2){
b2Body*body=*pos2;
如果(body->GetUserData()!=NULL){
CCSprite*sprite=(CCSprite*)body->GetUserData();
[自移除儿童:精灵清理:是];
}
_世界->毁灭身体(身体);
}
重要的是要以正确的方式重写它,以摧毁一具尸体


如果有人编写了正确的方法来销毁主体,我会将其标记为正确答案。

在最后一组代码中,您是否删除了迭代器当前指向的项?如果是,则迭代器将无效,因此在不调用未定义行为的情况下,它无法递增。如果是这种情况,似乎应该这样做我注意到的一件事是,如果你成功地通过了游戏中的第一环,它会在摧毁旧环之前调用addRing,并在摧毁前崩溃。我不确定破坏是否是问题所在。如果是这样的话,这似乎永远不会起作用--“未定义的行为”这意味着——行为是未定义的。这包括看起来工作正常。只有现在您才看到问题(如果问题是递增一个无效的迭代器).你是说它在尝试销毁时崩溃了吗?如果销毁是问题,CreateFixture代码中会发生异常吗?如果是,这与调用销毁之前的崩溃有什么关系?我只是查看你发布的代码。我不知道何时、何地或如何调用你的例程,因为你没有提供。我在说什么ng是指,如果您以这种方式编写循环,使用迭代器递增到下一项,如果迭代器(在本例中为
pos2
)指向刚删除的项,则执行
++pos2
是未定义的行为,因为迭代器无效。从向量中删除项的安全方法(我不知道方括号中的东西是什么意思)是使用
擦除/删除\u if
,从而避免编写循环。我同意似乎存在内存损坏。如果从迭代代码(而不是整个块)中注释掉
[self-removeChild:sprite cleanup:YES]
,会发生什么或者只是注释掉
\u world->DestroyBody(body)
代码?碰撞有什么区别吗?
void* b2BlockAllocator::Allocate(int32 size){

...

    if (m_freeLists[index]){
        b2Block* block = m_freeLists[index];
        m_freeLists[index] = block->next; <--------------CRASH
         return block;
    } else {

     ...

    }
}
> Printing description of this->m_freeLists:
(b2Block *[14]) m_freeLists = {
  [0] = 0x0000000000000000
  [1] = 0x0000000103ca4060
  [2] = 0x0000000103ca0080
  [3] = 0x0000000100b30120
  [4] = 0x0000000000000000
  [5] = 0x0000000103ca80a0
  [6] = 0x0000000300b2c180
  [7] = 0x0000000104240000
  [8] = 0x0000000000000000
  [9] = 0x000000010423c140
  [10] = 0x0000000000000000
  [11] = 0x0000000000000000
  [12] = 0x0000000000000000
  [13] = 0x0000000000000000
}
std::vector<b2Body *>::iterator pos2;
for(pos2 = toDestroy.begin(); pos2 != toDestroy.end(); ++pos2) {
    b2Body *body = *pos2;
    if (body->GetUserData() != NULL) {
        CCSprite *sprite = (CCSprite *) body->GetUserData();
        [self removeChild:sprite cleanup:YES];
    }
    _world->DestroyBody(body);
}