我有此代码,使我在行中出现运行时错误:

  body->CreateFixture(&boxDef)

我在Windows中使用cocos2d-x 2.1.5和box2d 2.2.1
CCSprite *sprite = CCSprite::create(imageName.c_str());
    this->addChild(sprite,1);

    b2BodyDef bodyDef;
    bodyDef.type = isStatic?b2_staticBody:b2_dynamicBody;
    bodyDef.position.Set((position.x+sprite->getContentSize().width/2.0f)/PTM_RATIO,
                         (position.y+sprite->getContentSize().height/2.0f)/PTM_RATIO);
    bodyDef.angle = CC_DEGREES_TO_RADIANS(rotation);
    bodyDef.userData = sprite;
    b2Body *body = world->CreateBody(&bodyDef);

    b2FixtureDef boxDef;
    if (isCircle)
    {
        b2CircleShape circle;
        circle.m_radius = sprite->getContentSize().width/2.0f/PTM_RATIO;
        boxDef.shape = &circle;
    }
    else
    {
        b2PolygonShape box;
        box.SetAsBox(sprite->getContentSize().width/2.0f/PTM_RATIO, sprite->getContentSize().height/2.0f/PTM_RATIO);
        boxDef.shape = &box;
    }

    if (isEnemy)
    {
        boxDef.userData = (void*)1;
        enemies->insert(body);

    }

    boxDef.density = 0.5f;
    body->CreateFixture(&boxDef)  //<-- HERE IS THE RUN TIME ERROR

;

当我调试box2d代码时即时通讯到达b2Fixture.cpp
在方法中:
void b2Fixture::Create(b2BlockAllocator* allocator, b2Body* body, const b2FixtureDef* def)

在行中:
m_shape = def->shape->Clone(allocator);

得到运行时错误:

最佳答案

整rick。我自己遇到了几次。它与可变范围有关。

boxDef.shape是问题所在。您可以在if/else块中将形状创建为局部变量,然后将其分配给boxDef。一旦执行离开if/else块作用域,这些局部变量将成为垃圾。 boxDef.shape现在指向已释放的内存。

解决方案是通过将圆形和框形声明移动到if/else块之前,将形状变量保持在范围内。

10-06 03:13