以下のコードのように、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);
}
私のスプライトクラスにはデストラクタがありませんでした...
もう1つの情報は、デバッグ中に、内部関数の消去でクラッシュすることがわかりました: _Destroy(_Mylast - 1, _Mylast);
問題は解決しました!その理由は私の Sprite クラスにあります。それをスマート ポインターとしてラップし、そのメンバー変数として別のスマート ポインターを作成しました。今はスマート ポインター メンバー変数を使用しませんでしたし、システムは再びクラッシュしませんでした....ベクターからスプライトを消去するときに、そのクラス内でスマート ポインターを使用できない理由について引き続き考えます。それは彼のメンバー変数で重要ですか?スマート ポインターを訴える代わりに生のポインターのみを使用する場合、そのメンバー変数を削除する必要がありますか?