像下面的代码一样,m_vSprites 是一个 shred_ptr 的向量,如果他的一个元素更新失败,我想从向量中删除它,但是当我想使用擦除时我的代码崩溃了。但我不知道为什么,有人可以帮忙吗?
我需要使用擦除的原因是因为我的应用程序会不断地在向量中添加元素,但如果某些元素满足它们的终止条件,也会不断地从向量中擦除对象。如果我不删除它,随着程序的运行,矢量会变得很大!
RECT rcOldSpritePos;
typedef boost::shared_ptr<Sprite> SmartSprite;
vector<SmartSprite>::iterator siSprite;
for (siSprite = m_vSprites.begin(); siSprite != m_vSprites.end();)
{
// Save the old sprite position in case we need to restore it
rcOldSpritePos = (*siSprite)->getPosition();
if (!((*siSprite)->update()))
{
// Kill the sprite
//siPreviousSprite = siSprite-1;
siSprite = m_vSprites.erase(siSprite);
}
else
{
siSprite++;
// See if the sprite collided with any others
if (checkSpriteCollision(*siSprite))
// Restore the old sprite position
(*siSprite)->setPosition(rcOldSpritePos.left, rcOldSpritePos.top);
}
}
我已经按照某人的建议更改了代码,但擦除功能仍然失败,请任何人有一些建议?
有关如何在 vecotr 中添加元素的更多信息
这里有什么问题吗?
SmartSprite sprite;
if (0 < enemies.size())
{
// Pick a random enemy to drop bomb
size_t nRandEnemy = (rand() % enemies.size());
RECT rRandEnemy = enemies.at(nRandEnemy)->getPosition();
sprite.reset(new BombSprite(m_system, rRandEnemy.right-OBJECTSIZE/2,
rRandEnemy.bottom));
m_vSprites.push_back(sprite);
}
我的精灵类没有任何析构函数......
另一个信息是,当我调试时,发现它在擦除内部函数中崩溃:_Destroy(_Mylast - 1, _Mylast);
问题解决了!,原因是在我的 Sprite 类中,我将它包装为一个智能指针,并创建了另一个智能指针作为其成员变量。现在我没有使用智能指针成员变量,系统也没有再次崩溃......我会继续思考为什么我不能在那个类中使用智能指针,当从向量中擦除精灵时,确实他的成员变量有关系吗?如果只使用原始指针而不是使用智能指针,我还需要删除该成员变量吗?