2012-01-04 11 views
0

私はゲームを持っていますが、問題のために削除されています。GameHandlerクラス、Gameクラス、およびGridクラスです。コンストラクタの後でオブジェクトが一見削除されたり、メモリが変更される

GameHandlerクラスには、そのヘッダーファイルにGameオブジェクトの宣言があります。 GameHandlerコンストラクタは、ゲームオブジェクトが再構築、そう

game = Game(); 

ゲームは、それのヘッダファイルのグリッドオブジェクトへのポインタの宣言を有します。次に、コンストラクタはGridオブジェクトを定義します。

grid = new Grid(x, y, z); 

次に、ゲームを最後まで(死亡または完了によって)進めることができます。私はゲームを終了すると、GameHandlerは私に再び起動するオプションを与え、これを行うために、私は単純にゲームの状態をリセットし、再度

game = Game(); 

を呼び出すと考えました。これは文句なしで、新しいゲームオブジェクトを作成して新しいグリッドを作成するように見えます。グリッドを更新したり描画したりするまでに、グリッドを構築した後、グリッド内のすべての変数の位置が0xfeeefef2などのデータを指しています。いくつかの検索に基づいてプログラムの実行中に削除されました。これが削除される唯一の場所は、ゲームのデストラクタです。

私は現在ゲームオブジェクトを上書きしていますが、上書きしたオブジェクトはデストラクタと呼ぶことにしました。デストラクターはグリッドを消して空にします。私は正直なところ手がかりがないので、どんな洞察も良いでしょう。

+0

は、あなたのテストケースを表示します。 –

+0

ゲームコンストラクタ、代入演算子、およびゲームとグリッドのデストラクタも表示してください。 – dasblinkenlight

+0

コピー・コンストラクターはLightnessが指摘している可能性が高いです。ただし、このシナリオではGameの「リセット」メソッドを定義し、新しいオブジェクトを作成する代わりにそのメソッドを呼び出すことをお勧めします。私はここにゲームオブジェクトを作成したりコピーしたりすることに何の価値も見ません。 Gameオブジェクトを本当に破棄して新しいオブジェクトを作成したい場合は、代わりにスマートポインタを使用して、コピーを呼び出さないようにします。 – Gerald

答えて

1

あなたはコピーコンストラクタと代入演算子を定義するのを忘れて、あなたのGame Sの一つは、ポインタがコピーされたため、他のGame sが使用され、そのデストラクタでGridGridを破壊しています。推測


class Game { 

    Grid* grid; 

    public: 
    Game(int x, int y, int z) : grid(0) { 
     grid = new Grid(x, y, z); 
    }; 

    ~Game() { 
     delete grid; 
    } 


    /* You forgot these: */ 

    Game(Game const& src) : grid(0) { 
     grid = new Grid(*(src.grid)); 
    } 

    Game& operator=(Game other) { 
     swap(other); 
     return *this; 
    } 

    void swap(Game& other) { 
     // swap all the members (and base subobject, if applicable) with other 
     std::swap(grid, other.grid); 
    } 
}; 
+1

完璧な推測。 3時間で頭痛を解決します。 :-)ありがとう – AxNo

+0

@AlexFurnell:問題ありません。それが価値あるものであれば、私の豊富なC++の経験は3分以上で得られました。 :) –

関連する問題