繁体   English   中英

使用前检查指针? 必要性和替代方法,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的指针,有一个明显的替代选择:引用。 (有关更多信息,请参见基本注意事项技术细节 )。

如果您使用指针,那么按照定义,您必须处理每个指针均为NULL的可能性。


更新:一个很愚蠢的例子:

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

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

get_existing_owner().some_function();

显然,在get_existing_...以上,检查方法可以实现/重新用于其他指针。

如果不能绝对保证从返回指针的函数中收到有效的指针,则需要检查该指针。 如果库是黑匣子(您不拥有代码),则您可能会想到库作者的话,该指针将始终有效,但是基于以上注释,这似乎并没有这里的情况。

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

准则支持库中有一个名为not_null<T>的模板,可用于封装指针,以保证该指针永远不会为NULL。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM