У меня очень странное поведение в моем приложении.
Я расскажу о своей ситуации, а затем объясню, что происходит не так.
Ситуация
У меня есть метод с такой сигнатурой:
const StructureDef *getStructure(const std::string &theme, int index);
И я называю это в этом фрагменте кода:
const StructureDef *sDef = 0;
do
{
sDef = ss->getStructure(theme, rand() % ss->availableStructureCount());
} while (!sDef);
Я использую эту структуру do-while, потому что возвращаемое значение метода getStructure
может быть NULL
, в зависимости от комбинации theme
и index
. Так что в основном, то, что он делает, задает случайные структуры, пока мы не получим действительный. (Если вы хотите узнать подробности, взгляните на скриншоты.)
Метод выполняет итерацию по std::vector<StructureDef>
с помощью ::iterator
. И для каждого StructureDef он проверяет, принадлежит ли эта структура этой теме. Если это так, добавьте счетчик и проверьте, совпадает ли он с запрошенным индексом. Вот так:
// inside the loop
if (i++ == index)
Если это произойдет, то возвращается StructureDef *
:
return sDef;
Что происходит неправильно
Я использую XCode 4.4 для этого отладчика, чтобы увидеть шаг за шагом, что происходит, что в основном является gdb.
Сначала метод, который я объяснил, найти StructureDef *
, который соответствует моим потребностям. Поэтому он возвращает этот указатель. Вот скриншот момента перед тем, как он вернется в отладчик:
(строка после цикла for просто return 0;
)
Здесь указатель sDef *
указывает на 0x1d563270
, где находится правильный экземпляр StructureDef
.
Следующий снимок экрана - это то, что мы получаем в куске кода, где я назвал этот метод:
Как вы можете видеть, указатель sDef *
, который получил возвращаемое значение метода, теперь указывает на 0x2fe03804
. Это не то, что метод вернулся вообще! Я думаю, что это указатель указывает куда-то в стек, а не на кучу. (Это должна быть куча, так как класс std::vector хранит свои объекты в куче, правильно?).
Я еще не могу использовать Valgrind, так как я нахожусь в Mac OS X 10.8, который не поддерживается Valgrind.
Я полностью удивлен этим поведением. Я не понимаю, почему это происходит... Может быть, мой компилятор сломан, или он делает какую-то странную "оптимизацию"?
Спасибо заранее! Мартейн
Чтобы прояснить комментарий DeadMG:
Я использую разные темы:
iron
wood
ice
и т.д...
Мои идентификаторы выглядят следующим образом:
iron__downside_touch_and_go
iron__platform__700_65
iron__wall_bang
wood__platform__600_40
и т.д. Что я хочу сделать, это выбрать структуру с определенным индексом в одной теме. Так что не индексируйте совокупность структур всех тем вместе, а индекс подмножества одной темы. Взгляните на кусок кода еще раз:)
Обновление!!!
Я дал неверную информацию. Вектор имеет тип std::vector<StructureDef>
!! Он хранит объекты. Не указатели!
Итак, что (я думаю), что я делаю с вызовом .operator->()
, это то же самое, что: &(*it)
. И похоже, что он работает. Для меня это выглядело немного глупо, чтобы писать и * друг за другом.
@Ben Voigt:
Архитектура:
Оптимизация: