获取非常奇怪的数组边界异常
Getting array boundary exception that is so weird
我正在尝试实现一个 space 入侵者游戏,现在我正在尝试检查子弹是否击中了入侵者,然后将其删除。
只有当我试图射杀该行中的最后一个入侵者时才会出现异常。
例如,如果我只有一排和 8 个入侵者,最后一个,当子弹击中它时,我无一例外地得到了一个奇怪的边界。
初始化就是这样,伪代码:
struct Invaders_t
{
vector<Invader*> *invaders;
}
for (int j = 0; j < 1; j++)
{
x_spacing = 15;
for (int i = 0; i < 8; i++)
{
Invader *invader = new Invader();
g_Invaders.invaders->push_back(invader);
}
每帧:
for (int x = 0; x < 1; x++)
{
for (int y = 0; y < 8; y++)
{
Invader *pInvader = (*(g_Invaders.invaders))[x*8 + y];
if (pInvader != nullptr && pInvader->AlienAtals->GetImage() != nullptr)
{
for (list<Bullet*>::iterator it = ship->Bullets->begin(); it != ship->Bullets->end(); it++)
{
float left = (*it)->Position.x - 5;
float top = (*it)->Position.y - 13;
if (CheckCollision(left, top, pInvader->AlienSprite->m_X, pInvader->AlienSprite->GetImage()->GetWidth()/4
, pInvader->AlienSprite->m_Y, pInvader->AlienSprite->GetImage()->GetHeight()/4))
{
std::vector<Invader*>::iterator iter = g_Invaders.invaders->begin();
std::advance(iter, (x *8) + y);
Invader *invader = *iter;
g_Invaders.invaders->erase(iter);
delete invader;
}
}
}
}
}
当你删除一个入侵者(g_Invaders.invaders->erase(iter);
)时,vector的大小减少1(iter
之后的所有vector元素都向开头移动1个位置,填补空缺space).您的代码没有预料到这一点,并继续迭代向量,就好像仍然有完整的元素集一样。
我正在尝试实现一个 space 入侵者游戏,现在我正在尝试检查子弹是否击中了入侵者,然后将其删除。
只有当我试图射杀该行中的最后一个入侵者时才会出现异常。 例如,如果我只有一排和 8 个入侵者,最后一个,当子弹击中它时,我无一例外地得到了一个奇怪的边界。
初始化就是这样,伪代码:
struct Invaders_t
{
vector<Invader*> *invaders;
}
for (int j = 0; j < 1; j++)
{
x_spacing = 15;
for (int i = 0; i < 8; i++)
{
Invader *invader = new Invader();
g_Invaders.invaders->push_back(invader);
}
每帧:
for (int x = 0; x < 1; x++)
{
for (int y = 0; y < 8; y++)
{
Invader *pInvader = (*(g_Invaders.invaders))[x*8 + y];
if (pInvader != nullptr && pInvader->AlienAtals->GetImage() != nullptr)
{
for (list<Bullet*>::iterator it = ship->Bullets->begin(); it != ship->Bullets->end(); it++)
{
float left = (*it)->Position.x - 5;
float top = (*it)->Position.y - 13;
if (CheckCollision(left, top, pInvader->AlienSprite->m_X, pInvader->AlienSprite->GetImage()->GetWidth()/4
, pInvader->AlienSprite->m_Y, pInvader->AlienSprite->GetImage()->GetHeight()/4))
{
std::vector<Invader*>::iterator iter = g_Invaders.invaders->begin();
std::advance(iter, (x *8) + y);
Invader *invader = *iter;
g_Invaders.invaders->erase(iter);
delete invader;
}
}
}
}
}
当你删除一个入侵者(g_Invaders.invaders->erase(iter);
)时,vector的大小减少1(iter
之后的所有vector元素都向开头移动1个位置,填补空缺space).您的代码没有预料到这一点,并继续迭代向量,就好像仍然有完整的元素集一样。