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 对那条线说:

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

但是我在我的初始化列表中初始化了它!我想我相信 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

第二次编辑:

会不会是这个问题!!???

在我的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%)减少代码片段的过程已经为您发现了错误。


编辑:您的添加仍然没有给出问题的可编译示例,但至少有足够的信息来识别问题 - 或者至少是其中之一:

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

我不确定new()在初始化列表中调用是否合法。但我确信此时您还没有完全初始化this,因此您的IntroScreen构造函数很可能会做虚假的事情。

于 2010-07-16T16:02:01.303 回答
1

我找到了:

getSpeedFactor()由于像gettimeofday(). 开始值(更新游戏所用的时间)设置为初始化为零,而停止值是当天的微秒:它给出了全天的时间而不是更新时间。一旦游戏循环运行一次,就会纠正错误的值(因为分配了开始值)。但是第一次执行游戏逻辑时,我曾经 getSpeedFactor()分配过counter,这样就counter得到了-10000的值......

谢谢大家。

于 2010-07-16T17:12:34.270 回答
0

在我的脑海中,您可能需要定义具有适当初始值设定项的私有默认构造函数和复制构造函数。没有使用过 valgrind,但忘记做这件事是很常见的。

于 2010-07-16T15:58:33.123 回答
0

如果您有疑问,只需添加调试 printf 语句或等效语句。但这次我不会相信 Valgrind。

顺便说一句:删除不会“取消初始化”一个值。它删除了对象,但指针仍然指向那个内存位置——它确实有一个值。

于 2010-07-16T16:00:52.620 回答