【问题标题】:UE4 how to check a pointer if it's not initialized? C++UE4如何检查未初始化的指针? C++
【发布时间】:2021-08-01 19:15:45
【问题描述】:

如果我创建一个指针并想检查它而不出错,我该怎么做?一些方法是:

Ainfantry_actor* test_pointer;

if (IsValid(test_pointer)) { ... }
if (test_pointer!= nullptr) { ... }
if (test_pointer) { ... }

当我使用其中之一时,得到这个:“未初始化的局部变量'test_pointer'”

提前致谢。

【问题讨论】:

  • 你不能。编译器可以做出很好的猜测,但即使它是正确的,您的程序也无法获得该信息。
  • 未初始化变量的内容是indeterminate,因此您可能对其值应用的任何测试都可能完全是偶然成功的。因此这是不可能的。事实上,大多数这样的测试无论如何都会导致未定义的行为。所以想出一个不涉及这个的更好的算法。
  • 您可以使用Ainfantry_actor* test_pointer = nullptr;。因为您没有初始化变量,所以它会获得一个“随机”值(如果您在visual-studio 中使用调试器test_pointer 将获得值0xcccccccc)。
  • @Sebphil 建议我可以接受,谢谢。
  • 以任何方式读取未初始化的内存都是c++中的ub。要在虚幻的层面上回答您的问题,使用 IsValid 可能会在某些时候绊倒您。使用test_pointer!= nullptr 或简单的test_pointer 足以测试指针是否为nullptr。您可以使用 uobjects 更进一步,并测试它们是否正在等待杀死。然而,这是非常罕见的,当它是你可能会使用内置该功能的weakptrs。

标签: c++ unreal-engine4


【解决方案1】:

如果指针未初始化,如何检查它? C++

无法检查对象是否已初始化。

也没有办法检查指针是否有效。

有一些方法可以检查指针是否已初始化为 null,并检查它是否指向特定对象。如果您对未初始化的指针执行此类检查,则程序的行为将是未定义的。不要那样做。

【讨论】:

    【解决方案2】:

    您在这里遇到的问题是使用了未初始化的变量,它不仅限于指针。通常,当您声明变量而不初始化它时,编译器会抛出警告。您的代码中不应有任何未初始化的变量。

    【讨论】:

    • "您的代码中不应有任何未初始化的变量。"只是大部分是真的。分配初始化内存没有错。在初始化之前尝试读取它时会出现问题(c 或 c++ 零初始化所有内存并非偶然)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    相关资源
    最近更新 更多