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

时间:2017-01-06 19:11:34

标签: c++ pointers unreal-engine4

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

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

我意识到崩溃在用户体验方面非常糟糕,并且总是建议编写具有最大稳健性的代码,但是有哪些众所周知的情况下模式真的很有用? (例如,在理论上安全的设置中,例如指针设置为GetOwner())。

如果是这样,有什么常见的选择吗? (也许是利用智能指针?)

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

2 个答案:

答案 0 :(得分:0)

由于标记为--specs=nano.specs,因此对于不能为C++的指针有一个明显的替代方案:引用。 (有关详情,请参阅basic considerationstechnical details。)

如果你坚持使用指针,那么根据定义,你可以处理每个人都NULL的可能性。

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

NULL

请注意,这会改变代码的行为,以防AActor & get_existing_owner() { AActor * pActor = getOwner(); check(pActor); return *pActor; } 实际返回getOwner一段时间(参见UE Assertions)。然后你可以写别的地方(没有进一步检查):

nullptr

显然,上面的get_existing_owner().some_function(); 检查方法可以通过其他指针进行基因实现/重用。

答案 1 :(得分:0)

如果您没有绝对保证从返回指针的函数接收有效指针,则需要检查该指针。如果库是黑盒子(你不拥有代码),你也许可以把图书馆作者的话说明指针永远有效,但是基于上面的评论,这似乎不是这里的情况。

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

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