Наиболее вероятное объяснение состоит в том, что вы звоните 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>
: из вашего кода не нужно, чтобы список содержал указателей .Это сильно упростит вещи.