2012-03-21 10 views
0

私は元々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()コンストラクタとは関係がないことを知っています。なぜなら、ゲームボードの初期化中に呼び出されてからです。

+0

メモリエラーのようです。 LinuxやOS Xの場合は、valgrindを使用して動的メモリアクセスの問題を解決することをお勧めします:http://valgrind.org/ – Alex

+0

これらは実行中の唯一の2つのメソッドですか? –

+0

あなたのプログラムをエラーを示す最短の完全なプログラムに減らして、あなたの質問に** complete **、** short **プログラムを投稿してください。詳細はhttp://sscce.orgを参照してください。 –

答えて

0

私が疑うが、m_whiteArmym_blackArmyの簡易コピーをやってChessGameためのあなたのコピーコンストラクタとコピー代入演算子ことを、あなたが共有している情報から証明することができません。 (注:コピーコンストラクタまたはコピー代入演算子を指定しない場合、コンパイラはそれらを提供します)。

あなたはRule of Threeに違反しています。

次の方法でこの問題を解決することができます:ChessGameオブジェクトをコピーすることはありません

  • 上記を強制する:
    • (前のC++ 11):コピーコンストラクタとコピー代入演算子を宣言していない。
    • (C++ 11):コピーコンストラクタおよびコピー代入演算子宣言の後に= deleteを指定します。スマートポインタ(のようなstd::shared_ptr)にあなたのポインタを変更する
  • 。、または
  • あなたのコピーコンストラクタとコピー代入演算子の深いコピーを実装します。
+0

私は実際には私のコードでChessGameクラスをコピーすることはないので、それは問題だと思うと私はこれまでにメソッドや関数または参照。 –

+0

私は、上記のコードが、どのようにベクトルを使用しようとしているのか、フィードバックに基づいて、私が投稿したものがOKであると推測しているという点で、上記のコードが合法であるかどうかをほとんど尋ねていたと思います。現時点で私の最大の問題は、 "new"で壊れているエラーをデバッグする方法を見つけようとしていることです:(もし私のメモリが限界を超え、既存の連続した割り当てを踏まえれば、 –

+0

Robがコードを減らして、後で私の発見を再投稿したように、私はスレッドを持っていればそれは一つのことだと思っています。 –

関連する問題