Hola! Como ya te diste cuenta el error se debe al ingresar una letra en vez de un entero. Esto ocurre porque al introducir el caracter cin genera un error haciendo que en
opcion no se almacene nada, pero que sucede con el caracter ingresado??? este caracter queda en el bufer del teclado y por lo tanto en cada ciclo del while, cin va a generar un error ya que intenta leer constantemente esa letra.
Para solucionar el error tenes que limpiar el bufer del teclado agregando este bucle:
Otra solucion seria trabajar con caracteres, osea q opcion sea de tipo char
Saludos
PD: como estas en C++ creo q deberias usar cin.get en vez de getchar(pero igual deberia funcionar)