When you push an object into a list, the object is copied. That is, a new object is created inside the list and the old value is copied over. Otherwise it wouldn't take a reference.
About erase... consider the list (below) and an iterator to the "5".
Code:
[ 1 2 3 4 5 6 7 8 9 ]
^
If we now "erase" that 5, where does the iterator point? If we're lucky, it might point to 6. But then again, it might not.
Why not? Because there is no pointer "next to" 5 in memory. All the items are linked together with pointers to different places in memory.
So to ensure we have a valid iterator, we must reassign it after calling erase.