Список инициализаторов делает переменную неинициализированной?
У меня есть класс с единственным конструктором, как это:
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, но это обычная вещь, которую стоит забыть сделать.