使用前检查指针?必要性和替代方案,C++ UE4

Checking pointers before using? necessity and alternatives, C++ UE4

我是UE4新手,遇到过使用前检查每个指针的一般模式,例如:

AActor *pActor = getOwner(); 
if(pActor){
   pActor->SOME_FUNCTION();
}

我知道崩溃在用户体验方面很糟糕,并且始终建议编写具有最大稳健性的代码,但是否存在该模式真正有用的众所周知的案例? (例如在理论上安全的设置中,例如指针设置为 GetOwner())。

如果是这样,是否有任何通用的替代方案? (也许利用智能指针?)

编辑: 在我的问题中,我想得到关于 UE4 的具体答案,因为我遇到了一个仅与 UE4 相关的来源,它建议我检查指针,尽管我不确定它的必要性和模式。

因为它被标记为 C++,所以有一个明显的替代指针不能是 NULL:引用。 (有关详细信息,请参阅 basic considerations or technical details)。

如果你继续使用指针,根据定义,你必须处理每个指针都是 NULL.

的可能性

更新:一个非常愚蠢的例子:

AActor & get_existing_owner() 
{
    AActor * pActor = getOwner(); 
    check(pActor);
    return *pActor;
}

请注意,这会改变代码的行为,以防 getOwner 实际上 returns nullptr 某些时候(参见 UE Assertions)。然后你可以在其他地方写(无需进一步检查):

get_existing_owner().some_function();

显然上面 get_existing_... 检查方法可以通用化/重用于其他指针。

如果不能绝对保证从 returns 指针的函数接收到有效指针,则需要检查该指针。对于黑盒库(您不拥有代码),您也许可以接受库作者的话,即指针将始终有效,但根据上面的评论,这似乎不是这里的情况。

有趣的是,在 C++ 核心指南中:http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#S-gsl

Guidelines Support Library 中有一个名为 not_null<T> 的模板,可用于封装指针以保证指针永远不会为 NULL。