我是UE4的新手,我在使用它之前遇到了检查每个指针的一般模式,例如:
AActor *pActor = getOwner();
if(pActor){
pActor->SOME_FUNCTION();
}
我意识到崩溃在用户体验方面非常糟糕,并且总是建议编写具有最大稳健性的代码,但是有哪些众所周知的情况下模式真的很有用? (例如,在理论上安全的设置中,例如指针设置为GetOwner()
)。
如果是这样,有什么常见的选择吗? (也许是利用智能指针?)
编辑: 在我的问题中,我想特别得到关于UE4的答案,因为我遇到了一个仅与UE4有关的来源,它建议我检查指针,虽然我不确定它的必要性和模式。
答案 0 :(得分:0)
由于标记为--specs=nano.specs
,因此对于不能为C++
的指针有一个明显的替代方案:引用。 (有关详情,请参阅basic considerations或technical 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。