Having trouble deleting vectors

Started by
2 comments, last by Joakim Thor 11 years, 6 months ago
Hi all,

After thinking I was beginning to get the hang of everything, I have come up stuck again. I have hit this problem before where I iterate around a vector and after some collision detection decide whether to delete it or not.

When one of the bullets hit the boss, the game crashes and exits with a code 3.

What confuses me is that this method works well for other places in the game where I need to delete the bullets so where am I going wrong? I know that I am dereferencing incorrectly but just cannot see why here.



for (std::vector<boss>::iterator bossIT = boss1.begin(); bossIT != boss1.end(); bossIT++)
{
(*bossIT).move(spaceShip1.xPosition(), spaceShip1.yPosition()); // Moves the boss
for (std::vector<bullet>::iterator bulletIT = aBullet.begin(); bulletIT != aBullet.end(); bulletIT++) // Loops around each bullet
{
if((*bossIT).xPosition() + 32 >= (*bulletIT).xPosition() && (*bossIT).xPosition() <= (*bulletIT).xPosition() + 10 && // Detects Collision
(*bossIT).yPosition() + 32 >= (*bulletIT).yPosition() && (*bossIT).yPosition() <= (*bulletIT).yPosition() + 10)
{
aBullet.erase(aBullet.begin()+bulletIterator); // Crashes here with code 3
(*bossIT).hit();
}
}
}


Any help would be greatly appreciated. Thanks
Advertisement
Where is "bulletIterator" defined? I dont see it, I see "bulletIT", is bulletIterator a typo? or another variable that shouldnt be there?
I would call the line "(*bossIT).hit();" before doing any list clean up just so that the logic of your if statement collision check is done before things start getting deleted and moved around. erase removes the current element and returns an iterator to the next, which is end() if you erase the last element.

for (std::vector<bullet>::iterator bulletIT = aBullet.begin(); bulletIT != aBullet.end(); ) // Loops around each bullet
{
if((*bossIT).xPosition() + 32 >= (*bulletIT).xPosition() && (*bossIT).xPosition() <= (*bulletIT).xPosition() + 10 && // Detects Collision
(*bossIT).yPosition() + 32 >= (*bulletIT).yPosition() && (*bossIT).yPosition() <= (*bulletIT).yPosition() + 10)
{
(*bossIT).hit();
bulletIT = aBullet.erase(bulletIT); // update iterator with next if collision
}
else
++ bulletIT; // no collision go to next bullet
}
Yes, you are quite correct... I have made a typo :-(

Thanks for pointing it out and also for the other suggestions. It now works for me :)
Just have to point this out: Code 3 means SIGSEGV. SIGSEGVs are Segmentation Faults. They usually occurs when:

  • dereferencing NULL pointers,
  • attempting to access memory the program does not have rights to (such as kernel structures in process context)
  • attempting to access a nonexistent memory address (outside process's address space)
  • attempting to write read-only memory (such as code segment),
  • a buffer overflow,
  • using uninitialized pointers.

This might help you figure out Code 3 problems later on!

(list copied from wiki)

If you don't understand the stuff written here, please sharpen your C++ skills.

This topic is closed to new replies.

Advertisement