2013-02-04 102 views
0

我得到一個EXC_BAD_ACCESS從b2fixture訪問一個b2body。這很可能是由於我缺乏在C知識++,因爲我是一個ObjC開發在C混合++(剛開始Box2D的):EXC_BAD_ACCESS with box2d and b2body

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 

我分配climbingHoldContact在b2ContactListener,這是一個很值得從這段代碼複製: 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; 
+0

請發佈堆棧跟蹤。 – trojanfoe

+0

爲NULL指針添加更多檢查 –

回答

0

這個變量,myContact,是本地BeginContact

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

但在這裏,你存儲一個指針,以供將來參考:

bodyHoldUD.climbingHoldContact = &myContact; 

BeginContact返回時,myContact變量就不存在了,而當你後來試圖訪問其fixtureA電腦說EXC_BAD_ACCESS因爲無論是已經被別的東西覆蓋了。
這與返回指向本地變量的指針相同。

請注意,您構建的示例在向量中存儲MyContact s,而不是MyContact* s。

您應該可以通過將climbingHoldContact成員更改爲不成爲指針來修復此問題。