零、导语
估计大部分纯粹的C++玩家
都遇不上野指针问题(当指针指向的对象被回收后,仍然通过该指针访问该对象,会导致崩溃或未定义行为)。毕竟标准库的智能指针用习惯了,裸指针都极少见,想野都很难野。
但基于UE进行C++程序开发的时候,就不一样了,一不留神可能就会出现野指针。
一、不纯粹的C++玩家遇到的野指针
怎么就不纯粹了
这里主要指C+STL玩家,用C风格写着C++代码,喜欢std::sort、std::map、std::vector等STL实用功能,但不喜欢面向对象以及使用智能指针管理内存。如有冒犯还请见谅,[笔者大学期间搞ACM竞赛的时候就是C+STL玩家,当时虽然用着C++但着实不敢自称C++玩家
]。
非UE野指针
这里的非UE野指针,是想作为反面例子来引入和对比UE的野指针。
贴一段笔者高中的时候,刚学C++那会儿写的代码
struct coder_meow_t {
int32_t food;
int32_t skill;
}
coder_meow_t* get_meow(int32_t in_food, int32_t in_skill){
coder_meow_t a_meow;
a_meow.food = in_food;
a_meow.skill = in_skill;
coder_meow_t* a_meow_ptr = &a_meow;
return a_meow_ptr;
}
想获得野指针,直接调get_meow()
就好。
二、常见的UE4野指针的case
1.复制粘贴漏了
习惯了定义裸指针成员并交给UE管理内存,但偶尔忘了加UPROPERTY()。
但其实,大概率是复制粘贴的时候,复制漏了[手动狗头:虽然笔者自己暂时没有遇到过,但真的很有可能是这样]
。
2.合代码的时候,UPROPERTY()被吞了
比如一个类
UCLASS()
class ACoderMeowActor : public AActor
{
GENERATED_BODY()
private:
UPROPERTY(Replicated)
FCoderMeowArray MyCoderMeows;
};
A玩家在A开发分支新增了一个成员
private:
UPROPERTY(Replicated)
FCoderMeowArray MyCoderMeows;
UPROPERTY()
ACoderMeowFood* Food;
B玩家在B开发分支新增了一个成员
private:
UPROPERTY(Replicated)
FCoderMeowArray MyCoderMeows;
UPROPERTY()
ACoderMeowSkill* Skill;
把他们进行代码合并的时候可能会变成
private:
UPROPERTY(Replicated)
FCoderMeowArray MyCoderMeows;
UPROPERTY()
ACoderMeowFood* Food;
ACoderMeowSkill* Skill;
此时访问ACoderMeowSkill* Skill为未定义行为。
3.没有继承自UObject
的纯c++类对象
对于自定义的没有继承自UObject
的对象,即使标为UPROPERTY,依然无法直接通过UE4
的垃圾回收系统管理其内存.
private:
UPROPERTY()
coder_meow_t* meow;
其实这种case根本编译不过的,倒是很好避免。
4.等遇上其它case了再继续添加了
笔者只有2个月的UE4开发经验,目前只知道这些case,欢迎评论区留言分享更多的UE野指针的case,[感谢]
。
(公众号文章没法改,遇上新的case笔者会更新到自己的技术博客网站上https://www.prolightsfxjh.com/
)
三、UE4防止野指针的解决办法
1. 添加 UPROPERTY:
确保所有需要被垃圾回收的UObject
指针都标记为UPROPERTY
。
UPROPERTY()
UCoderMeowObject* CoderMeowObject;
2.定期检查现有代码:
定期review代码,确保所有UObject
指针都正确标记。目前还没有找到自动化工具来检查是否漏了UPROPERTY
标记,用流水线定期扫描是最稳妥的。
3.使用智能指针:
对于非UObject
对象,考虑使用TSharedPtr
或TWeakPtr
等智能指针,避免手动管理内存。
对于UE4自定义的nostd智能指针
-
专为引擎的代码风格和内存管理机制优化,特别是与非 UObject
对象(如自定义C++ 类
)一起使用。 -
与 UE4
的其他容器和工具(如TArray
、TSharedRef
等)无缝集成。 -
避免依赖 C++
标准库,确保跨平台兼容性。
4.之后想到或遇到其它好办法再继续更新
同上,欢迎评论区留言分享更多的避免UE野指针的技巧,[感谢]
。
关于
本博所有文章均为博主原创,未经许可不得转载。
https://www.prolightsfxjh.com/article/ue4-uproperty-raw-ptr/
Thank you!
------from ProLightsfx
如果你对推荐系统、游戏开发、C++优化、程序员内功等感兴趣或者想参与讨论的话,欢迎关注笔者公众号.
非特殊说明,本博所有文章均为博主原创,未经许可不得转载。
如经许可后转载,请注明出处:https://prolightsfxjh.com/article/ue4-uproperty-raw-ptr/
共有 0 条评论