使用前检查指针?必要性和替代方案,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。
我是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。