2013-10-30 33 views
0

everyone:Cocos2d-x:0xC0000005:訪問違規讀取地址0xCDCDCDD1

這個問題很奇怪。我先粘貼我的代碼。兩個CCSchedules,這是在初始化intialized()方法被用來

void GameObjectsLayer::updateEnemy(float interval) 
{ 
    UNREFERENCED_PARAMETER(interval); 
    Enemy *lpEnemy = new Enemy("enemy1.png", 1, 10, 8); 
    lpEnemy->getSprite()->setAnchorPoint(CCPointZero); 
     lpEnemy->setPosition(ccp(-30, 400)); 
    CCMoveTo *lpMoveAction = CCMoveTo::create(350.0f/ENEMY1_MOVE_SPEED, ccp(320, lpEnemy->getPosition().y)); 
    CCCallFuncND *lpCallback = CCCallFuncND::create(lpEnemy->getSprite(), callfuncND_selector(GameObjectsLayer::removeEnemy), lpEnemy); 
    CCSequence *lpSeqActions = CCSequence::create(lpMoveAction, lpCallback, NULL); 
    this->addChild(lpEnemy->getSprite(), 10); 
    lpEnemy->getSprite()->runAction(lpSeqActions); 
    // When I set the breakpoint here, the _vEnemies is valid and the application runs well. 
    _vEnemies->push_back(lpEnemy); 
} 

void GameObjectsLayer::removeEnemy(CCNode *lpSender, void *lpParam) 
{ 
    Enemy *lpEnemy = (Enemy*)lpParam; 
    lpEnemy->getSprite()->stopAllActions(); 
    this->removeChild(lpSender); 
    // When access the _vEnemies variable here, the exception occurs at "_vEnemies->begin()" 
    // I set a breakpoint here, the address of _vEnemies is invalid, but I set a breakpoint in the previous function, the _vEnemies has a valid address, what happened? I really can't comprehend the behavior. _vEnemies is the member variable of this class. 
    std::vector<Enemy*>::iterator iter = _vEnemies->begin(); 
    while (iter != _vEnemies->end()) 
    { 
     if (lpEnemy == *iter) 
     { 
      this->removeChild(lpEnemy->getSprite()); 
      //delete *iter; 
      iter = _vEnemies->erase(iter); 
      continue; 
     } 
     ++iter; 
    } 
    delete lpEnemy; 
} 

這兩種方法中,所述代碼是下面:

bool GameObjectsLayer::init() 
{ 
    bool bRet = false; 
    do 
    { 
     /* not important, omit them */ 

     this->schedule(schedule_selector(GameObjectsLayer::updateEnemy), 5.0f); 
     this->schedule(schedule_selector(GameObjectsLayer::enemyShoot), 1.0f); 

     scheduleUpdate(); 

     bRet = true; 
    } 
    while (0); 

    return bRet; 
} 

我有一個頭部疼痛。我不知道發生了什麼事。我的cocos2d-x的版本是2.1.5,而IDE是VS2012。感謝您的幫助..

+0

正在訪問0xCDCDCDCD ...通常是您在刪除指針後使用指針的標誌。 –

+0

好吧,thx,它在我將_vEnemies作爲參數從updateEnemy()方法傳遞給removeEnemy()方法時起作用。但是我仍然不知道爲什麼_vEnemies在removeEnemy()方法中直接訪問時具有無效地址。這太奇怪了...... –

回答

0

那麼,這是一箇舊的,但任何人誰可能絆倒在這裏:

的問題似乎是在這一行

CCCallFuncND *lpCallback = CCCallFuncND::create(lpEnemy->getSprite(), callfuncND_selector(GameObjectsLayer::removeEnemy), lpEnemy); 

這個簽名(從docs)是

static CCCallFuncND* create (CCObject *pSelectorTarget, 
           SEL_CallFuncND selector, 
           void * d 
          ) 

*pSelectorTarget是在其上selector被調用的對象。所以在這個例子中它應該是this而不是lpEnemy->getSprite()

坦率地說,它似乎有點奇怪,它並沒有崩潰。

相關問題