Hi!请登陆

UE4一不留神就会出现的野指针问题如何破解

ProLightsfx 2025-3-5 78 3/5

零、导语

估计大部分纯粹的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_tget_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对象,考虑使用TSharedPtrTWeakPtr等智能指针,避免手动管理内存。

对于UE4自定义的nostd智能指针

  • 专为引擎的代码风格和内存管理机制优化,特别是与非UObject对象(如自定义C++ 类)一起使用。
  • UE4的其他容器和工具(如TArrayTSharedRef 等)无缝集成。
  • 避免依赖C++标准库,确保跨平台兼容性。

4.之后想到或遇到其它好办法再继续更新

同上,欢迎评论区留言分享更多的避免UE野指针的技巧,[感谢]

关于

本博所有文章均为博主原创,未经许可不得转载。

https://www.prolightsfxjh.com/article/ue4-uproperty-raw-ptr/

Thank you!

                                                                                                                                             ------from ProLightsfx

如果你对推荐系统、游戏开发、C++优化、程序员内功等感兴趣或者想参与讨论的话,欢迎关注笔者公众号.

UE4一不留神就会出现的野指针问题如何破解

- THE END -

ProLightsfx

3月06日15:42

最后修改:2025年3月6日
0

非特殊说明,本博所有文章均为博主原创,未经许可不得转载。

共有 0 条评论