私は元々stlリストを使ってチェスを格納していました。私はベクトルが多形性をサポートしていないことを理解しています。これを回避するにはの代わりに<Unit *>
のベクトルを保存しています。すべてのチェスピースオブジェクト(Pawn、Rook、Bishopなど)はUnitクラスから継承しています。派生クラスから別の派生クラスへのポインタを持つベクトル要素をスワップします
しかし、まだベクトルとヒープの破損に問題があるようです。 STLベクトルはまだのような場合に問題を持っているでしょう理由があるポインタは4バイトしかかかわらず、それが指すもののあるので
Unit *ChessGame::PromoteUnit(Unit *_oldUnit, UnitType _newType)
{
vector<Unit *> &army = (_oldUnit->m_gameColor == WHITE) ? m_whiteArmy : m_blackArmy;
Unit *newUnit = NULL;
for (unsigned int i = 0; i < army.size(); ++i)
{
if (army[i]->m_subId == _oldUnit->m_subId)
{
if (_newType == QUEEN && _oldUnit->m_gameColor == WHITE)
{
newUnit = new Queen(*_oldUnit);
newUnit->ActiveTexture_(m_textureMan->TextureId_(WhiteQueen));
}
else if (_newType == KNIGHT && _oldUnit->m_gameColor == WHITE)
{
newUnit = new Knight(*_oldUnit);
newUnit->ActiveTexture_(m_textureMan->TextureId_(WhiteKnight));
}
else if (_newType == QUEEN && _oldUnit->m_gameColor == BLACK)
{
newUnit = new Queen(*_oldUnit);
newUnit->ActiveTexture_(m_textureMan->TextureId_(BlackQueen));
}
else if (_newType == KNIGHT && _oldUnit->m_gameColor == BLACK)
{
newUnit = new Knight(*_oldUnit);
newUnit->ActiveTexture_(m_textureMan->TextureId_(BlackKnight));
}
newUnit->m_wasPawn = true;
delete army[i];
army[i] = newUnit;
break;
}
}
m_selectedUnit = newUnit;
return newUnit;
}
:私は、私は次の関数にそれを突き止めたと思いますこの? My Pawnオブジェクトは、KnightまたはQueenがプロモートしているサイズよりも8バイト大きく、おそらく私が得ている奇妙なメモリエラーを説明します。それは文字通りにクラッシュ
Unit *ChessGame::DemoteUnit(Unit *_oldUnit, UnitType _newType)
{
COUT("ChessGameManager::_DemoteUnit(Unit *, UnitType)");
vector<Unit *> &army = (_oldUnit->m_gameColor == WHITE) ? m_whiteArmy : m_blackArmy;
Unit *newUnit = NULL;
for (unsigned int i = 0; i < army.size(); ++i)
{
if (army[i]->m_subId == _oldUnit->m_subId)
{
newUnit = new Pawn();
newUnit->m_wasPawn = false;
if (_oldUnit->m_gameColor == WHITE)
newUnit->ActiveTexture_(m_textureMan->TextureId_(WhitePawn));
newUnit->m_gameColor = _oldUnit->m_gameColor;
newUnit->MobilityValid_(false);
newUnit->Color_(RvColor::ClrWhite);
newUnit->m_square = _oldUnit->m_square;
newUnit->m_captured = false;
newUnit->m_origin = _oldUnit->m_origin;
newUnit->m_subId = _oldUnit->m_subId;
newUnit->m_visible = true;
//newUnit->m_square->m_unit = newUnit;
delete army[i];
army[i] = newUnit;
break;
}
}
return newUnit;
}
::私は昇進逆に私の降格機能を私の番履歴をバックアップするとヒットする場合)
newUnit = new Pawn();
は(新しいポーンにステッピングを新しい内部でクラッシュすることを引き起こしmallocを使用してヒープメモリを予約しようとすると、とにかく私はそれがまだベクトルstlがどのように働くかを完全に理解していないことと関係があると思っています。私はPawn()コンストラクタとは関係がないことを知っています。なぜなら、ゲームボードの初期化中に呼び出されてからです。
メモリエラーのようです。 LinuxやOS Xの場合は、valgrindを使用して動的メモリアクセスの問題を解決することをお勧めします:http://valgrind.org/ – Alex
これらは実行中の唯一の2つのメソッドですか? –
あなたのプログラムをエラーを示す最短の完全なプログラムに減らして、あなたの質問に** complete **、** short **プログラムを投稿してください。詳細はhttp://sscce.orgを参照してください。 –