Список инициализаторов делает переменную неинициализированной?

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

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 классы....

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

Редактировать:

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

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

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

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

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

В моем Game класс, я инициализирую это IntroScreen как это:

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

view здесь указатель на абстрактный супер-тип IntroScreen называется View,

5 ответов

Решение

Я нашел это:

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

Другие вопросы по тегам