【问题标题】:What is the difference between not initializing a pointer, and having it be initialized to null?不初始化指针和将其初始化为 null 有什么区别?
【发布时间】:2012-12-25 22:54:58
【问题描述】:

我正在构建一个简单的通用引擎,以便我真正开始制作游戏,并且我正在尝试以某种方式组织和体面地制作我的引擎,这意味着我不希望它成为我扔掉的东西一旦我完成了我的计划,就到一边。

我添加了要显示的对象,drawObjects,这些对象可以移动,也可以不移动,并且有动画,或者没有动画。

如果他们确实有动画,我想初始化一个 animationSet,而这个 animationSet 里面会有 xxx animationComp。由于我试图保持整洁并且一直致力于对内存和 cpu 使用的“优化”(例如共享已加载的图像指针,以及我想到的任何东西),我不想在数组中要求可能未使用的内存.

所以我最初有animationSetS* animationSet = NULL;,计划在之后执行animationSet = animationSetS[spacesINEED];,仅在需要我添加动画的对象上,即那些不是NULL 的动画对象,因此不使用内存(对吗? )。 然后就出现了这个问题! (标题)

    struct animationComp {
        SDL_Rect* clip;
        int clipsize;
    };

    struct animationSetS {
        animationComp* animation;
        int currentFrame;
        int currentAnimation;
        int animationNumber;
    };

    struct drawObject { // Um objecto.
        char* name;
        SDL_Surface* surface;
        bool draw = true;
        float xPos;
        float yPos;
        bool willMove = false; // 0 - Won't move, 10 - Moves alot, TO IMPLEMENT
        bool isSprite = false;
        animationSetS* animationSet;
    };

我的问题涉及了很多,对此我深表歉意。对于此处的任何澄清回复,我会在接下来的 10 分钟内回复……也许 1 小时?或者更多。 谢谢!

【问题讨论】:

标签: c++ struct null initialization declare


【解决方案1】:

将指针设置为 NULL 意味着您将能够添加 ASSERT(ptr != NULL); 并知道您的指针不会意外包含来自它正在使用的内存中的任何垃圾值。

因此,如果由于某种原因,您最终在对象未正确设置之前就使用了它,您可以检测到它。

如果您有时不使用字段也有帮助,您仍然可以调用delete stuff; [假设它首先被分配]。

请注意,未初始化变量意味着它可以在其有效范围内具有任何值 [对于某些类型,在有效范围之外 - 例如指针和浮点值可以是“处理器不允许的值”]。这意味着不可能在代码中“判断”它是否已初始化——但如果你不初始化,事情就会变得非常糟糕!

【讨论】:

  • 所以让它 = NULL 或者只是声明基本上是一样的?谢谢!
  • @user1896797 他没这么说!
  • 除了他说的,我的意思是一样的。
  • 我刚刚澄清了。是的,您节省了一点代码和时间,但与您必须花费两天时间来查找导致代码崩溃的指针相比节省的时间[仅在某些情况下,当您执行某项操作时,您很不走运,所以在游戏中每两个小时一次,或者类似的],这绝对不值得保存!
  • 哦,当你删除东西时不要忘记将指针设为 NULL!
【解决方案2】:

如果这真的应该在 C++ 中实现(如您所写),您为什么不使用 C++ 标准库?喜欢

struct animationSetS {
    std::vector< std::shared_ptr<animationComp> > animation;
    // ...
}

【讨论】:

  • 我同意,这是一个更好的解决方案!
  • 由于我对 C++ 缺乏经验,因此我试图从头开始使用结构来完成这一切,而无需库只是为了习惯使用指针等等。这是一件坏事吗?
  • @user1896797:这不是一件坏事——但你为什么要重新实现所有已经存在的东西?
  • 出于同样的原因,我们多年来在大学构建自己的数据结构 - 因为通过自己编码,意识到存在哪些障碍和解决方案,我们才能真正理解它。编辑——一旦我们真正理解它,或者至少掌握它,是的,我们使用(我会)已经完成且编码良好的库——为什么要重新发明轮子:)
  • 如果你制作了一个(某种程度的)真正的游戏引擎,我很确定你仍然会学习指针和其他各种东西。用简单的方法做简单的事情绝对比用困难的方法做更好的选择。无论如何,所有(除了最简单的)编程项目都会给你一些困难的事情——所以让那些不需要复杂的事情变得简单,并在你不知道如何做的复杂部分中学习!跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-23
  • 1970-01-01
  • 2023-02-21
  • 1970-01-01
  • 2011-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多