Проблемы с указателями в списке - PullRequest
1 голос
/ 18 октября 2011

По какой-то причине, когда я пытаюсь прочитать свойство указателя на объект (GamePlayer) внутри std::list (playerlist), оно сначала работает, но когда я пытаюсь получить к нему доступ позже в другой функции Я получаю кучу случайных чисел вместо номеров для сокета моего клиента. Это было глотком, извини. Я надеюсь, что кто-то может пролить свет на ситуацию. Я включу упрощенную версию дефектного кода.

class GameRoom  {

    list<GamePlayer*> playerlist;
    locigPort( LogicObj );
}


bool GameRoom::logicPort( LogicObj logit )  {   // This is room[1]

    list<GamePlayer*>::iterator it;

        for (it = playerlist.begin(); it != playerlist.end(); it++){  

                cout << "socket numbers " << (*it)->socketno << endl;  
                /* (*it)->socketno gives me a bunch of random numbers, 
                   not the socket numbers I was looking for! */
        }  

    return true;

}

bool RoomDB::addPlayer( GamePlayer *playerpoint )   {

    roomlist[1].playerlist.push_back( playerpoint );    
    // This adds the player object to the Gameroom object

    cout << "player point " << playerpoint->socketno << " roomno: " << roomno;  
    // This shows everything should be ok so far

    return true;
}

1 Ответ

1 голос
/ 18 октября 2011

Наиболее вероятное объяснение состоит в том, что вы звоните addPlayer с указателем, который становится недействительным к тому времени, когда вы звоните logicPort.Одна возможность состоит в том, что вы вызываете addPlayer с адресом объекта в стеке, и объект исчезает, когда стек разматывается.

edit Проблема здесь:

bool PlayerDB::addPlayer( int sid, GamePlayer tempplayer ) {
   ...
   roomman.addPlayer( &tempplayer, tempplayer.roomno );
}

PlayerDB::addPlayer принимает второй аргумент по значению.Это означает, что он получает копию, которая существует в течение всего времени существования метода.Затем вы берете указатель на эту копию и добавляете ее в список.После возврата PlayerDB::addPlayer указатель становится недействительным.

Трудно предложить хорошее исправление, не увидев больше кода.Одна возможность состоит в том, чтобы заставить PlayerDB::addPlayer принять указатель в качестве второго аргумента, и убедиться, что вы не будете повторять одну и ту же ошибку на один уровень вверх по цепочке вызовов .

Еще лучшая возможностьэто превращение playerlist в list<GamePlayer>: из вашего кода не нужно, чтобы список содержал указателей .Это сильно упростит вещи.

...