代码之家  ›  专栏  ›  技术社区  ›  Martijn Courteaux

初始值设定项列表使变量未初始化?

  •  1
  • Martijn Courteaux  · 技术社区  · 16 年前

    我有一个类,只有这样的构造函数:

    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)
    

    瓦尔格林说:

    条件跳转或移动取决于未初始化的值

    counter 获取错误的值,因此需要很长时间,直到计数器达到10。

    这些是我使用的所有行(初始值设定项列表中除外) :

    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语句是将所有赋值 柜台 你在里面。

    第二次编辑:

    这就是问题所在!!??

    Game 同学们,我初始化它 IntroScreen 这样地:

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

    view 这里是一个指向 介绍屏幕 打电话 View

    5 回复  |  直到 15 年前
        1
  •  6
  •   Mark B    16 年前

    你是不是不小心 counter

    否则,valgrind可能正在一个已经删除的对象中诊断这个问题(可能使用sentry值)。

    或者瓦尔格林可能错了。

        2
  •  2
  •   DevSolar    16 年前

    没有足够的代码来重现问题。

    一般SO/开发者论坛建议:

    一定要提供一个最小的代码片段来重现问题。

    通常(在我的经验中,大约85%的情况下)减少代码片段的过程已经为您揭示了错误。


    您添加的内容仍然不能提供问题的可编译示例,但至少有足够的信息来确定问题,或者至少有一个:

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

    我不确定 new() 确保没有完全初始化的 this IntroScreen 构造器做了假的事。

        3
  •  1
  •   Martijn Courteaux    15 年前

    我找到了:

    getSpeedFactor() 只在我第一次调用它时返回一个完全错误的数字,因为时间函数 gettimeofday() . 开始值(更新游戏所用的时间)被初始化为零,停止值是当天的微秒:它给出了一整天的时间而不是更新时间。一旦游戏循环运行一次,错误的值就会被纠正(因为开始值被分配)。但第一次执行游戏逻辑时,我使用 getSpeedFactor() counter ,这样的话 得到-10000的值。。。

    谢谢大家。

        4
  •  0
  •   kfh    16 年前

    在我的脑子里,你可能需要定义私有的默认值和复制构造函数,这些构造函数有适当的初始值设定项。我没用过valgrind,但忘了做是很平常的事。

        5
  •  0
  •   Piotr Kalinowski    16 年前