std::vector 越界
std::vector out of boundary
在下面的代码中,assert 语句有效(变为假)。但是,没有任何并行线程访问数组。实际上根本没有任何并行代码。当我在函数的开头携带行(在 visual studio 中)时,它可以正常工作。什么可能导致问题?我看不出任何理由。
void CheckProjectileMeteorCollision()
{
int i = ((int)m_meteorManager.m_meteors.size() - 1);
for (i; i > -1; i--)
{
int j = ((int)m_projectileManager.m_projectiles.size() - 1);
for (j; j > -1; j--)
{
assert(i != m_meteorManager.m_meteors.size());
if (SpherePointIntersection(
m_meteorManager.m_meteors[i]->m_node->m_translation,
m_meteorManager.m_meteors[i]->m_collisionRadius,
m_projectileManager.m_projectiles[j]->m_node->m_translation))
{
SafeDel(m_projectileManager.m_projectiles[j]);
m_projectileManager.m_projectiles.erase(m_projectileManager.m_projectiles.begin() + j);
SafeDel(m_meteorManager.m_meteors[i]);
m_meteorManager.m_meteors.erase(m_meteorManager.m_meteors.begin() + i);
}
}
}
}
可能存在以下问题:内部循环(for J)可能会删除多个 m_meteor 的元素。如果是这样,内循环将比遍历外循环更快地擦除外循环(对于 I)的元素。
在下面的代码中,assert 语句有效(变为假)。但是,没有任何并行线程访问数组。实际上根本没有任何并行代码。当我在函数的开头携带行(在 visual studio 中)时,它可以正常工作。什么可能导致问题?我看不出任何理由。
void CheckProjectileMeteorCollision()
{
int i = ((int)m_meteorManager.m_meteors.size() - 1);
for (i; i > -1; i--)
{
int j = ((int)m_projectileManager.m_projectiles.size() - 1);
for (j; j > -1; j--)
{
assert(i != m_meteorManager.m_meteors.size());
if (SpherePointIntersection(
m_meteorManager.m_meteors[i]->m_node->m_translation,
m_meteorManager.m_meteors[i]->m_collisionRadius,
m_projectileManager.m_projectiles[j]->m_node->m_translation))
{
SafeDel(m_projectileManager.m_projectiles[j]);
m_projectileManager.m_projectiles.erase(m_projectileManager.m_projectiles.begin() + j);
SafeDel(m_meteorManager.m_meteors[i]);
m_meteorManager.m_meteors.erase(m_meteorManager.m_meteors.begin() + i);
}
}
}
}
可能存在以下问题:内部循环(for J)可能会删除多个 m_meteor 的元素。如果是这样,内循环将比遍历外循环更快地擦除外循环(对于 I)的元素。