Code:
if (laser->Properties.LifeTimer>laser->Properties.LifeDistance)
{
if (laser!=Lasers.end())
{
This just seems somewhat odd, since you're checking if the iterator is valid AFTER you've already dereferenced it, but I assume that you're already aware of this.
From what I see in your code, every time you delete a laser, the iterator will skip the next laser: You delete the laser, assign the iterator to the next laser, and then you hit the end of the loop and the iterator increments again; thus you've skipped the laser in between. So if you have an odd number of iterators:
0) You have 3 elements
1) Delete element 0, iterator now points to element 0 (previously element 1)
2) Do something with element 0, increment iterator; now points to element 1 (formerly 2)
0b) You now have 2 elements, iterator points to element 1 (last)
1b) Delete this element, iterator now points to end
2b) If iterator != end, do nothing; increment iterator; now points 1 beyond end
0c) You now have 1 element, iterator points beyond the end of the sequence (still != end).
1c) Try to dereference it, and BOOM! kablooey, your loop crashes.
One quick solution I can think of is, stick it in a while loop and do the iterator management by hand (if you erase an element, don't increment iterator).