【学习笔记】UE4——TSoftClassPtr<T> ptr/TSoftObjectPtr<T> ptr

前言

本文章仅作为个人学习笔记,本章中包含错误、过时、遗漏知识点等问题,因此请读者发现上述问题请谅解并且欢迎指正。本文更新时间:2020-8-6

引用

虚幻4官方中文文档:
TSoftClassPtr:

https://docs.unrealengine.com/en-US/API/Runtime/CoreUObject/UObject/TSoftClassPtr/index.html

TSoftObjectPtr

https://docs.unrealengine.com/en-US/API/Runtime/CoreUObject/UObject/TSoftObjectPtr/index.html

异步资源加载

https://docs.unrealengine.com/zh-CN/Programming/Assets/AsyncLoading/index.html

个人解读

原理

软指针中存放两个重要变量,其一为指针类型,其二为String(存放路径用)。在生成实例化之前,UE4引擎会在后台自动生成一个默认模板的对象并且不可修改。当使用软指针时,会先寻找内存中的指针对象,如果没有则根据路径去硬盘中寻找。因此多半情况是在对象未正式实例化时,提前引用其模板对象。本文章主要通过以下代码,获得软指针,并允许其在笔者创建的组件上,方便赋值。

    
这段代码存在多个问题。 首先,在主函数中,`SmartPtr<int> ptr1 = new int(0);` 会创建一个 `SmartPtr` 对象,并将一个 `int` 指针赋值给它。然而,这个指针没有通过 `new` 运算符分配内存,应该使用 `SmartPtr<int> ptr1(new int(0));` 来分配内存并创建 `SmartPtr` 对象。 其次,在 `SmartPtr` 类中,拷贝构造函数 `SmartPtr(SmartPtr<T> & rhs)` 和赋值运算符 `operator=` 都没有考虑到资源所有权的问题。当使用 `SmartPtr<int> ptr2(ptr1);` 进行拷贝构造时,`ptr2` 和 `ptr1` 将拥有相同的指针,当其中一个 `SmartPtr` 对象被销毁时,它将删除指针,导致另一个 `SmartPtr` 对象持有一个无效的指针。同样的问题也存在于 `ptr3=ptr2;` 的赋值操作中。为了解决这个问题,应该实现深拷贝和移动语义。 最后,在 `SmartPtr` 类中,`pointee` 应该是一个指针类型,而不是一个对象类型。因为在析构函数中使用了 `delete` 运算符,它只能删除指针类型的资源,而无法删除对象类型的资源。 下面是修正后的代码: ```c++ template <class T> class SmartPtr { public: SmartPtr(T* p = nullptr) : pointee(p) {} ~SmartPtr() { delete pointee; } SmartPtr(const SmartPtr& rhs) : pointee(rhs.pointee ? new T(*rhs.pointee) : nullptr) {} SmartPtr(SmartPtr&& rhs) : pointee(rhs.pointee) { rhs.pointee = nullptr; } SmartPtr& operator=(SmartPtr rhs) { std::swap(pointee, rhs.pointee); return *this; } private: T* pointee; }; int main() { SmartPtr<int> ptr1(new int(0)); SmartPtr<int> ptr2(ptr1); SmartPtr<int> ptr3; ptr3 = ptr2; return 0; } ``` 在修改后的代码中,使用了深拷贝和移动语义,修复了资源所有权的问题。同时,在 `SmartPtr` 类中,`pointee` 被定义为指针类型,可以正确地释放资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值