2013-07-05 6 views
0

У меня есть функция, которая проверяет движение других игроков на карте и соответственно корректирует их положение, а также проверяет, если только игрок вступил.std :: vector push_back() вылетает из программы

void mapManager::checkForOtherPlayerMovement(int plyId) 
{ 
    sf::Packet receivedPacket; 
    std::vector<player>::iterator it; 
    player pl(0,0,1); 

    if(socket->Receive(receivedPacket) == sf::Socket::Done) 
    { 
     int header; 
     receivedPacket >> header; 

     switch(header) 
     { 
      case PACKET_PLAYER_DISPATCHNEWPOSITION: 
      { 
       receivedPacket >> pl; 

       std::cout << pl.plyId << std::endl; 

       if(plyId != pl.plyId) 
       { 
        try 
        { 
         if(pl.plyId != 0) 
         { 
          std::cout << "DEBUG1" << std::endl; 
          players->at(pl.plyId-1).posX = pl.posX; 
          players->at(pl.plyId-1).posY = pl.posY; 
         } 
         else 
         { 
          std::cout << "DEBUG2" << std::endl; 
          players->at(pl.plyId).posX = pl.posX; 
          players->at(pl.plyId).posY = pl.posY; 
         } 


        } 
        catch(const std::out_of_range& oor) 
        { 
         std::cout << "Added new player!" << std::endl; 
         players->push_back(pl); // This crashes 

        } 
       } 


       break; 

      } 
      case PACKET_PLAYER_DISPATCHENTEREDMAP: 
      { 
       break; 
      } 


     } 
    } 





} 

Так что в основном авария происходит, когда новый игрок подключается к серверу, и игра должна добавить его внутри вектора. Странно то, что он не разбился на визуальной студии 2010 года, но падает, когда я перешел на vs 2012, поэтому я должен делать что-то неправильно.

EDIT: Вот как вектор игроков создается

mapManager.h

std::vector<player> * players; 

mapManager.cpp

players = new std::vector<player>(); 

Здесь я использую вектор игроков

void mapManager::drawOtherPlayers(int plyId, player *ownPlayer) 
{ 
    ownPlayerSprite->SetPosition(ownPlayer->getX(), ownPlayer->getY()); 
    window.Draw(*ownPlayerSprite); 

    for(std::vector<player>::iterator it = players->begin(); it != players->end(); ++it) 
    { 
      spriteToDraw->SetPosition(it->posX,it->posY); 
      window.Draw(*spriteToDraw); 
    } 

} 

My pla yer class: Player.h and player.cpp

+0

Что такое 'игроки'? –

+0

std :: vector * игроки; players = new std :: vector (); –

+0

Какая ошибка возникает при сбое программы? – asafrob

ответ

1

В коде, который вы указали, нет ничего плохого.

В то время как конструкция try-catch, которую вы используете, может и не быть чем-то, что я сделал бы, нет ничего плохого в этом, насколько я могу судить. Стандарты C++ 03 и C++ 11 гарантируют, что at будет throw a std::out_of_range, если элемент не существует.

Вам нужно найти в другом месте ошибку. Одна вещь, которая вызывает интерес, заключается в том, что вы динамически выделяете vector. Никаких аргументов в пользу этого не представлено, но поскольку нет ничего плохого в том, как вы используете vectorпри условии, что он существует, вероятным сценарием является то, что vector поврежден, был удален или что-то еще не так с вашим динамическим управлением памятью. Если вы можете обойтись без использования динамического распределения, я бы настоятельно рекомендовал его. Если вы не можете обойтись без динамического распределения, по крайней мере, используйте интеллектуальный указатель вместо необработанных указателей.

Другое место для поиска - это конструкторы для player, в частности конструктор копирования. Поскольку push_back собирается создать копию добавляемого элемента, если нет ничего плохого в самом vector, проблема может возникнуть в конструкторе копирования.

Написать конструктор копирования для player, как это:

player (const player& rhs) 
: 
    posX (rhs.posX), 
    mapId (rhs.mapId), 
    plyId (rhs.plyId), 
    playerModel (rhs.playerModel) 
{ 
} 

Установить точку останова на первой строке списка инициализации. Удалось ли? Вступите в конструктор каждого члена. Они рушится?

+0

Я изменил динамически выделенный вектор обратно, но проблема все еще сохраняется. –

+0

@SamuliLehtonen: Там же и таким же образом? –

+0

Да на том же месте. Если я прокомментирую откат, это не сбой, так что это линия, где он сбой. –

Смежные вопросы