1

次のような唯一のコンストラクターを持つクラスがあります。

IntroScreen::IntroScreen(Game *game) :
    View(game), counter(0.0f), message(-1), continueAlpha(255),
    continueVisible(false), screenAlpha(255), fadeIn(false), fadeOut(false)
{
}

メソッドのどこかに、このifステートメントがあります

if (counter > 10.0f)

そして、Valgrind はその行について次のように述べています。

条件付きジャンプまたは移動は、初期化されていない値に依存します

しかし、初期化子リストで初期化しました! そして、私はヴァルグリンドを信じていると思います。なぜなら、すべてがうまくいくこともあれば、何も起こらないこともあるからです....だから、おそらくcounter間違った値を取得して、カウンターが10に達するまでに時間がかかります.

いくつかのエラーに対してカウンターを使用しているコードを既にチェックしています。しかし、C ++ステートメントで「値の初期化を解除」することはできないと思います...

これらは、私が使用するすべての行です(初期化リストを除く)counter

counter += speed;
counter = 20.0f;
counter += game->getSpeedFactor();
if (counter >= 15.f)
counter = 15.f;
if (counter > 10.0f)

Valgrind は に対して同じ出力を与えますscreenAlpha

両方の変数があり、クラスprivateがありません....friend

それで、何が起こっているのですか?問題は何ですか?

編集:

私は値を出力しました:
コンストラクターでは、それは正しいです:0
私の方法では、それはゴミでした. 次のようなランダムな値を優先しました。

  • -97298.8...
  • -106542.2...

print ステートメントは、へのすべての割り当てが含まれるメソッドの最初の行ですcounter

2番目の編集:

これが問題になる可能性があります!??

私のGameクラスでは、次IntroScreenのように初期化します。

Game::Game() : /* Some other stuff .... */  , view(new IntroScreen(this))`
{}

viewIntroScreenはここで、呼び出された の抽象スーパータイプへのポインタViewです。

4

5 に答える 5

6

counter初期化されていないローカル変数で誤ってシャドウを行いましたか?

それ以外の場合は、valgrind が既に削除されたオブジェクトでこれを診断している可能性があります (おそらくセントリー値を使用)。

または、valgrind が間違っている可能性があります。

于 2010-07-16T16:05:00.650 に答える
2

問題を再現するのに十分なコードがありません。

一般的なSO/開発者フォーラムのアドバイス:

問題を再現する最小限のコードスニペットを提供してください。

かなり頻繁に(私の経験ではすべてのケースの約85%)、コードスニペットを削減するプロセスですでにバグが明らかになっています。


編集:あなたの追加はまだあなたの問題のコンパイル可能な例を与えませんが、少なくとも問題を特定するのに十分な情報-または少なくともそれらの1つ:

Game::Game() : /* Some other stuff .... */  , view(new IntroScreen(this))`
{}

new()イニシャライザリストで呼び出しが合法であるかどうかはわかりません。ただし、この時点では完全に初期化されていないことは確かです。そのため、コンストラクターが偽のことを行う可能性があります。thisIntroScreen

于 2010-07-16T16:02:01.303 に答える
1

見つけた:

getSpeedFactor()のような時間関数のために、完全に間違った番号を最初に呼び出したときにのみ返しますgettimeofday()。開始値 (ゲームの更新にかかった時間) はゼロに初期化され、終了値は 1 日のマイクロ単位で設定されます。これは、更新時間ではなく、1 日全体の時間を示します。ゲーム ループが 1 回実行されると、間違った値が修正されます (開始値が割り当てられるため)。しかし、ゲームロジックが初めて実行されたとき、私は getSpeedFactor()を代入counterしていたのでcounter、-10000 の値を得る...

皆さんありがとう。

于 2010-07-16T17:12:34.270 に答える
0

疑問がある場合は、デバッグ用のprintfステートメントまたは同等のものを追加するだけです。しかし、今回はValgrindを信じません。

ところで:削除は値を「初期化解除」しません。オブジェクトを削除しますが、ポインタは引き続きそのメモリ位置を指します—値があります。

于 2010-07-16T16:00:52.620 に答える
0

私の頭の上から、適切な初期化子を持つプライベートデフォルトとコピーコンストラクターを定義する必要があるかもしれません。valgrind を使用したことはありませんが、忘れがちなことです。

于 2010-07-16T15:58:33.123 に答える