2014-02-02 2 views
-1

Бесполезный фон: я нахожусь на своей N-й итерации, работая над настройкой движка игры на основе сущности/компонента. У меня достаточно кода, написанного сейчас, так что я могу начать тестирование некоторых вызовов функций. Нечетное поведение, которое я вижу, это то, что члены экземпляра устанавливаются в разные значения, чем я ожидаю, но они всегда одинаковы для запуска. В какой-то момент приведенный ниже пример кода привел к отображению двух последовательных целых чисел, но теперь отображаются два не последовательных целых числа, и я не уверен, почему.Данные членов, перезаписанные на экземпляре стека

Проблема: Я разрабатываю систему сущностей, которая опирается на дескрипторы, поэтому я могу хранить однородные данные, собранные в памяти, чтобы избежать промахов в кеше (чтение: содержится в виде копий в векторах). Однако для двух последовательно созданных объектов я получаю радикально разные значения дескрипторов, когда они должны быть последовательными. Код, который проверяет такое поведение:

#include <dbes/engine.h> 
#include <iostream> 

int main(int argc, char **argv) { 
    Engine engine(10000); 

    Handle e1 = engine.createEntity(); 
    Handle e2 = engine.createEntity(); 

    std::cout << "e1: " << (unsigned int)e1 << " e2: " << (unsigned int)e2 << std::endl; 

    return 0; 
} 

код библиотеки доступен here.

Выход:

e1: 50331648 e2: 33564418 

Когда я пошагово вызова, члены экземпляра m_handleManager внутри экземпляра Engine на втором вызове createEntity(), кажется, все изменилось. Когда я отладки в затмении значения следующие: (Они все их ожидали, инициализируются значения по первому зову)

m_maxEntries : 4294959264 
m_activeCount: 32767 
m_firstFreeIndex: 9986 

Следует отметить, что возвращение от первого звонка до createEntity() всегда шаги мне через d'tor вектора. Я уверен, что это связано с моей проблемой, но я не могу понять, почему.

+0

Никто не собирается загружать весь ваш код и отлаживать его для вас. Сожалею. – OldProgrammer

+0

Особенно если вы * изменили код, который вы загрузили. У источника на GitHib есть конструктор для 'Engine (unsigned int maxHandles);' as private. Итак, 'Engine engine (10000),' не должен даже компилировать *. Предполагается, что только один синглет управляется статическими членами класса. – WhozCraig

+0

Хорошо, спасибо, что указали мою глупость. Однако _I_ не изменил код. [Создание с кодом, предоставленным точно так же, как и в сообщении] (http://imgur.com/OO7JtN5) – TheBurrito

ответ

0

Как указал WhozCraig, у меня был класс Engine, настроенный как одноэлементный. Как-то g ++/eclipse маскировали проблему и приводили к компиляции, хотя я использовал c'tor для Engine вместо моих статических функций init и экземпляра. Я несколько раз переключался назад и вперед, хочу ли я иметь сингл, и без компилятора, кричащего на меня, я забыл обновить свой тестовый код.

Редактировать: Я играл вокруг добавления c'tors и получил компилятор, чтобы жаловаться. Затем я снова их удалил, и компилятор все еще жаловался. Я не уверен, кто виноват здесь; будь то make, gcc или eclipse, но каким-то образом преуспевает, с явно неожиданными результатами.

Я отредактирую это снова, если я снова смогу воспроизвести компиляцию и выяснить, где находится разъединение.

Смежные вопросы