Список инициализаторов делает переменную неинициализированной? - PullRequest
1 голос
/ 16 июля 2010

У меня есть класс с единственным конструктором, подобным этому:

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, потребуется много времени.

Я уже проверяю свой код, где я использую счетчик для некоторых ошибок. Но я думаю, что вы не можете "не инициализировать значение" с помощью оператора 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 классов ....

Итак, что происходит? В чем может быть проблема?

Edit:

Я распечатал значение:
В конструкторе было исправлено: 0
В моем методе это был мусор. Он печатал случайные значения, такие как:

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

Оператор print является первой строкой метода, в которой находятся все присваивания counter.

Второе редактирование:

Может ли это быть проблемой !! ??

В моем Game классе я инициализирую IntroScreen следующим образом:

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

view - это указатель на абстрактный супертип IntroScreen, называемый View.

Ответы [ 5 ]

6 голосов
/ 16 июля 2010

Вы случайно скрыли counter с локальной неинициализированной переменной?

В противном случае возможно, что valgrind выполнит среднюю диагностику этого в объекте, который уже был удален (возможно, используя значения часового).

Или Вальгринд может ошибаться.

2 голосов
/ 16 июля 2010

Недостаточно кода для воспроизведения проблемы.

Общий SO / совет для разработчиков:

Предоставьте минимальный фрагмент кода, воспроизводящий проблему.

Довольно часто (примерно 85% всех случаев в моем опыте) процесс сокращения фрагмента кода уже обнаруживает ошибку для вас.


Редактировать: Ваше добавление все еще не дает компилируемый пример вашей проблемы, но достаточно информации, по крайней мере, для определения проблемы - или, по крайней мере, одного из них:

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

Я не уверен, является ли вызов new() даже допустимым в списке инициализаторов. Но я * уверен, что на данный момент у вас нет полностью инициализированной this, так что скорее всего ваш IntroScreen конструктор делает фиктивные вещи.

1 голос
/ 16 июля 2010

Я нашел это:

getSpeedFactor() возвращает только в первый раз, когда я называю его полностью неправильным номером из-за временных функций, таких как gettimeofday(). Начальное значение (время, которое потребовалось для обновления игры) устанавливается равным нулю, а конечное значение равно дням: оно дает время всего дня вместо времени обновления. После однократного запуска игрового цикла исправляется неправильное значение (из-за того, что назначается начальное значение). Но в первый раз, когда игровая логика была выполнена, я использовал getSpeedFactor(), чтобы присвоить counter, чтобы counter получил значение -10000 ...

Спасибо всем.

0 голосов
/ 16 июля 2010

Просто добавьте отладочный оператор printf или его эквивалент, если у вас есть сомнения. Но я бы не поверил Вальгринду на этот раз.

Кстати: удаление не «отменяет инициализацию» значения. Он удаляет объект, но указатель по-прежнему указывает на эту область памяти - у него есть значение.

0 голосов
/ 16 июля 2010

Вдобавок ко всему, вам может понадобиться определить приватные настройки по умолчанию и скопировать конструкторы, которые имеют надлежащие инициализаторы.Не использовал valgrind, но часто забывают это делать.

...