0

我有一个GameObject继承自Object. 进入它们的构造函数已经很疯狂了,但是对象的创建没有问题。在有人问之前,我正在调试构建。我来给你展示:

编辑由于人们抱怨,我将发布实际代码,而不是图像。

GameObject::GameObject(string name) : Object(name)
{
    // ...
}

Component* GameObject::AddComponent(SharedPtrComponent component)
{
    if (find(components.begin(), components.end(), component) == components.end())
    {
        components.push_back(component);
        return component.get();
    }

    return nullptr;
}

程序执行完GameObject构造函数的第一行(即Object初始化)后,会跳到大括号和return nullptrin之间的空行AddComponent

这是怎么回事?

PS。我在 express 和 Ultimate 版本上都试过这个。完全相同的步进顺序。我尝试过清洁等。Object构造函数也在起作用。毫米。

更新:好的,也许这可行:这是一个仍然表现出奇怪步进的最小项目:VS2013 项目

4

2 回答 2

2

好的,我相信我明白这里发生了什么。简而言之:这是 MSVS 调试器中的一个可视错误。

让我们看看发生了什么:首先你创建你的GameObject,它包括以下步骤:调用 parent ctor( Object) 并调用 initializers 和/或inline initializers。您没有初始化程序,但您有内联初始化程序 GameObject* parent = nullptr;

这正是调试器visually crazy必须执行初始化程序的原因,这些初始化程序不在此处,而是在标头中。我不确定它为什么会有这个故障,但如果你删除内联初始化程序,它就会消失。我建议向 Visual Studio 团队提交错误。这只是一个视觉错误,但仍然是一个错误。

于 2013-11-11T10:54:04.063 回答
0

如果在调试器中单步执行代码时遇到问题,切换到反汇编视图 ( ALT + 8) 并单步执行通常是个好主意。

您不必了解太多的程序集。只需寻找call说明等。请注意,如果您使用 F11 进入另一个函数(从反汇编视图call),则可以切换回实际的源代码(如果有的话)。

于 2013-11-11T10:48:55.633 回答