After the first run through display() both keyStates and keyPreviousState point to the same memory area. You probably want to use memcpy to copy the memory area pointed to by keyStates to the memory area pointed to by keyPreviousStates, but actually you copy the pointer keyStates to keyPreviousStates.
EDIT: To avoid such problems and clearly denote the situation, you should use const to make the variables read-only, in this case
bool* const keyStates = new bool(); bool* const keyPreviousStates = new bool();
Notice that this does not make the array elements read-only but just the pointers themselves.