2011-07-17 4 views
0

私はこのseg-fault問題を今何時間も解決する方法を見つけようとしています。ポインタのC++ベクトルが多すぎますか?

私はC++で4人のカードゲームを持っています。プレーヤー(基本クラス)は、コンピュータまたは人間(派生クラス)のいずれかです。それらを格納するために、別のクラスのplayerContainerがあります。これは独自の関数を持ち、プレーヤポインタのプライベートメンバーベクトルを使います。

std::vector<Player*> players_; 

私はベクトルに新しいプレーヤーを追加すると、私はこのような何か:

void playerContainer::add(Player* newPlayer) { 
    players_.push_back(newPlayer); 
} 

そして、私はgameLogicいると呼ばれる1つのクラスを持っている:アドオンがある

Human *newPlayer = new Human(); 
container.add(newPlayer); 

をプライベートメンバーのplayerContainerを持ち、(他のいくつかのものの中で)プレーヤの初期化を実行します。

しかし、私はMVC実装に組み込みようとした後にsegフォールトを取得しています。

GUIでは、ボタンをクリックしてゲームを開始します。このボタンは、ウィンドウのstartGame関数を呼び出し、パラメータを収集し、プライベートメンバーModelクラスのstartGameを呼び出します。このstartGameはプライベートメンバーのgameLogicのinitializePlayer関数を呼び出し、プライベートメンバーのplayerContainerのadd関数を呼び出します。その時点でプログラムは中断されます。

少しのテストで、私がステップを保存すれば、それはseg faultではないことがわかりました。たとえば、windowオブジェクトにgameLogicオブジェクトを与え、initializePlayer関数などを呼び出すと、プログラムは正常にエラーなく処理されます。

ModelとgameLogicのクラスを組み合わせるよりも優れた解決策があると確信しています。誰かがいくつかの洞察を提供することができます

また、少し混乱する場合は、私に明示するように依頼してください。私は明確に説明するために全力を尽くしましたが、非常に多くの異なるクラスが関わっているので、そうすることは困難です。

EDIT:プレイヤー*をintに置き換えることはできません。タイムリーな方法でこれを行うには大きすぎるコードです。

私はvalgrindを試しましたが、ログは巨大で一般的に役に立たなかった。あるいは、少なくとも私はそれの多くを理解することができませんでした。ここをクリックしたい方は、以下のscribdリンクをご覧ください: http://www.scribd.com/doc/60210916/Memory-Leak

push_backラインのplayerContainerのadd関数でsegフォルトが発生しています。

私は

+0

ベクターでPlayer *を使用せず、代わりにintを使用するとどうなりますか? Player *を直接使用して実行中のコードをコメントアウトすると、初期化されていないプレーヤーを使用しているのか、問題が他の場所にあるのかがわかります。 –

+1

サポートされているプラ​​ットフォームの場合は、プログラムを 'valgrind'で実行してください。 –

+0

コードをさらに表示してください。例えば追加されたプレーヤーを実装でどのように使用しますか?どのようにあなたのポインタなどを解放するのですか? –

答えて

0

は、あなたがどこかに、必ずお使いのモデルですが、initializePlayerが呼び出される前に、実際にplayerContainerを割り当て?...デバッガで私の手を試してみましょうか

+0

いいえ、私は完全に確信しているとは言えません。しかし何らかの理由で、gameLogicオブジェクトをウィンドウに追加するという正確な構文を使用すると、すべてうまくいく。どのように私はウィンドウでそれをやっているの違いと私はモデルでそれをやっているの違いを理解していない。 – SpeedBurner

+0

それ以上のコードなしで伝えるのは難しいです。どのようにして、playerContainerを宣言して割り当てるのですか?どのようにアクセスしますか? –

+0

playerContainerは暗黙のコンストラクタを使用し、1つのプライベートメンバー 'std :: vector players_'のみを持っています。 メンバーにアクセスするには、[{]演算子をオーバーロードしてplayers_ [i]を返します。 playerContainer自体を作成するのは、gameLogicのプライベートメンバーとしてのみ行われます。これはほとんどこれを行います。 'class gameLogic { private: playerContainer container; } ' – SpeedBurner