EXC_BAD_ACCESS与box2d和b2body

时间:2013-02-04 13:00:12

标签: c++ objective-c

我正在从b2fixture获取EXC_BAD_ACCESS访问b2body。这可能是由于我缺乏c ++知识,因为我是一个用c ++混合的ObjC开发(刚开始用box2d):

Myb2dUserData.h
@interface Myb2dUserData : NSObject {
    MyContact *climbingHoldContact;  
}

@property (nonatomic, assign) MyContact *climbingHoldContact;

Myb2dUserData.mm
    b2Fixture *fixA = climbingHoldContact->fixtureA;
    b2Body *bodA = fixA->GetBody(); //EXC_BAD_ACCESS

我在一个b2ContactListener中分配了climbHoldContact,它几乎是这段代码的副本: http://www.raywenderlich.com/505/how-to-create-a-simple-breakout-game-with-box2d-and-cocos2d-tutorial-part-22

void MyContactListener::BeginContact(b2Contact* contact) {


    MyContact myContact = { contact->GetFixtureA(), contact->GetFixtureB() };
    _contacts.push_back(myContact);

    b2Fixture *fixtureA = contact->GetFixtureA();
    b2Body *bodyA = fixtureA->GetBody();
    Myb2dUserData *userDataA = (Myb2dUserData *)bodyA->GetUserData();
    bodyHoldUD.climbingHoldContact = &myContact;

1 个答案:

答案 0 :(得分:0)

此变量myContactBeginContact的本地变量:

MyContact myContact = { contact->GetFixtureA(), contact->GetFixtureB() };

但是在这里,你要存储一个指向它的指针以供将来参考:

bodyHoldUD.climbingHoldContact = &myContact;

BeginContact返回时,myContact变量不再存在,当您稍后尝试访问其fixtureA时,您的计算机会显示EXC_BAD_ACCESS因为已覆盖的内容已被覆盖用别的东西。
这与返回指向局部变量的指针的问题相同。

请注意,您构建的示例将MyContact存储在向量中,而不是MyContact* s。

您应该能够通过仅将climbingHoldContact成员更改为不是指针来修复此问题。