You're following a null pointer.
#0 0x00000320 in ?? ()
#1 0x004020cb in StateManager::Loop (this=0x6bfeec) at src/StateManager.cpp:81
The first line, #0, the address is a very low number. This commonly happens when the compiler is looking at a null pointer (typically address 0) plus the offset of a data member. In this case, it is probably looking at 0 + 0x320, meaning it is looking for a function or data member 0x320 bytes in to a null object. (The value 0x320 == 800, meaning the address is 800 bytes in, which is fairly large for a non-resource object in C++. You might consider trimming your object size.)
Fortunately you've got another line in your dump. When the first line is a very low number like that generally you look at the second line, #1, and nearly always this will be a line of code that calls into a pointer. In your case, it is src/StateManager.cpp:81, which reads: (*it)->Event (); Jackpot, you've got a few of them. You dereference an iterator, then you follow it as a pointer.
So now to see what the iterator points to and what it contains. Look up one statement before for the definition, and this is the first line any of those items were used, which reinforces that one of the values are bad. The line that initialized it was: auto it = m_states.begin() + m_current;
So that gives a few possible errors.
For one thing, you don't check what happens if m_states is empty. Even if m_current is 0 you invoke undefined behavior. If the container is empty, the .begin() function will equal .end() and it is undefined behavior to dereference it. Bug #1. Ensure your container is not empty before using its contents.
It is also undefined behavior to move past the .end() of a container. You can reach .end(), but it is undefined to advance beyond it. Bug #2. Stay in range.
Next, if your m_states contains data but m_current advances to the end or beyond the end, then .begin() gives an iterator to the first one and the addition moves it forward. Depending on which condition the same as above, either you are forbidden from dereferencing that value, or you are forbidden from advancing past the end. Potential bug #3 because you don't validate either case.
Alternatively, your line of (*it)->Event (); could have a perfectly valid iterator, but the contents of the iterator are a null pointer. It is undefined behavior to follow a null pointer. So potential bug #4 is that you have stored a null value. If null is a proper condition for your code then you need to test for null before following your pointer. If null should never be allowed then you've put bad data into your container and you need to hunt that down.
Drop a breakpoint on line 79 and inspect the values to see which of those conditions you triggered. Whichever way the problem lies, you should modify your code to address and prevent all four possibilities.