0

我得到一个 EXC_BAD_ACCESS 从 b2fixture 访问 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 中分配了 crawlHoldContact,这几乎是这段代码的副本: 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;
4

1 回答 1

0

这个变量 ,myContact是本地的BeginContact

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

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

bodyHoldUD.climbingHoldContact = &myContact;

BeginContact返回时,该变量myContact不再存在,当您稍后尝试访问它时,fixtureA您的计算机会说EXC_BAD_ACCESS,因为那里的任何东西都被其他东西覆盖了。
这与返回指向局部变量的指针是相同的问题。

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

您应该能够通过将climbingHoldContact成员更改为不是指针来解决这个问题。

于 2013-02-04T14:34:51.497 回答