成员数据覆盖在堆栈实例上

时间:2014-02-02 04:43:16

标签: c++

无用的背景:我正在进行第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_handleManagerEngine实例中createEntity()个实例的成员似乎全部改变了。当我在eclipse中调试时,值如下:(它们是第一次调用时所有预期的初始化值)

m_maxEntries : 4294959264
m_activeCount: 32767
m_firstFreeIndex: 9986

值得注意的是,从第一次调用到createEntity()的返回总是让我通过向量的传递。我确定这与我的问题有关,但我似乎无法弄清楚原因。

1 个答案:

答案 0 :(得分:0)

正如WhozCraig指出的那样,我将我的Engine类设置为单例。不知何故g ++ / eclipse正在掩盖问题并导致编译,即使我使用引擎的c'tor而不是我的静态init和实例函数。我曾几次来回切换是否要让Engine成为单身,而且没有编译器对我大喊大叫,我忘了更新我的测试代码。

编辑: 我玩了添加c'tors并让编译器抱怨。然后我再次删除它们,编译器仍然抱怨。我不确定谁在这里有过错;无论是make,gcc还是eclipse,但是以某种方式构建成功,显然会有意想不到的结果。

如果我可以再次重新编译并找出断开连接的位置,我将再次编辑它。