Bo taka próba pisania do pliku nie zadziała i nie ma prawa działać.
Dla formalności, raport AddressSanitizera mówiący czemu się wysypuje:
16:00 $ g++ -g -fsanitize=address -std=c++11 main.cpp && ./a.out
=================================================================
==32105==ERROR: AddressSanitizer: attempting free on address which was not malloc()-ed: 0x7ffe77c63570 in thread T0
#0 0x7f6daae0fb2a in operator delete(void*) (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x99b2a)
#1 0x40160f in Player::~Player() /home/adrian17/test/main.cpp:5
#2 0x401434 in main /home/adrian17/test/main.cpp:20
#3 0x7f6daa3d182f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)
#4 0x401128 in _start (/home/adrian17/test/a.out+0x401128)
std::string w samej strukturze ma tylko wskaźniki i liczby z rozmiarami. Więc "przepisując" tą strukturę, przepisujesz wartości wskaźników - teraz masz dwa std::stringi ze wskaźnikami na ten sam bufor, co kompletnie się wysypie gdy oba w destruktorze spróbują zwolnić tą samą pamięć.