for(Player p:playerVectorReadIn){
Это итерация по значению, p
- это объект, локальный в области видимости для этого for
l oop, и является копией объекта в векторе. Каждый раз, когда эта l oop повторяется, этот объект уничтожается. Если l oop повторяется снова, создается новый объект p
.
player1=&p;
Это сохраняет указатель на этот локальный объект. Однако, как мы только что обнаружили, p
уничтожается в конце l oop, player1
становится висячим указателем на уничтоженный объект, и его использование впоследствии становится неопределенным поведением.
Это объясняет наблюдаемые вами нежелательные результаты. К счастью, решение очень простое, выполняйте итерацию по ссылке:
for(Player &p:playerVectorReadIn){
p
теперь является ссылкой на фактический объект в векторе, и пока сам вектор не перераспределяется впоследствии, указатель на объект в векторе останется действительным.