【UE4】共享(智能)指针用法

【UE 悬挂指针】C++传统指针,智能指针,以及UE的IsValid函数的原理 文章作者技术和水平有限,如果文中出现错误,希望大家能指正,同时有问题的话,欢迎大家留言讨论。 阅读详情
AI摘要

本文深入探讨了UE4中的智能指针系统,包括TSharedPtr、TSharedRef、TWeakPtr、TUniquePtr和TSharedFromThis的用法。详细介绍了每种智能指针的特点、初始化方式及如何在不同场景下安全地使用它们。

一、基本概念

在UE4中,继承UObject的类被实例化的对象在内存中可以被UE4的垃圾回收机制管理,从而不用担心内存泄漏等问题。但非继承UObject的普通C++类或结构体则需要被开发者管理,如果管理不善,很容易导致内存泄漏、野指针和程序崩溃等问题。对此,我们可以使用UE4提供的共享指针来创建和管理这些类对象。C++的stl库中也提供了一套智能指针系统来管理内存,但UE4的共享指针比stl库提供的智能指针相比具有以下优势:

  • 跨平台
  • 与UE4引擎容器协调工作
  • 针对平台的优化,如多线程等

UE4提供的共享指针主要有以下类型:TSharedPtr、TSharedRef、TWeakPtr、TUniquePtr。下面将一一介绍它们的用法。

二、UE4智能指针

1. TSharedPtr

使用共享指针创建对象:

TSharedPtr<TestStruct> StructPtr = MakeShareable(new TestStruct());

当使用共享指针时,为保证指针有效,可以使用IsValid判断指针的有效性:

if(StructPtr.IsValid())
{
	StructPtr->Name = "Alter Name";
}

获取普通指针:

StructPtr.Get();

重置指针:

StructPtr.Reset();

判断是否唯一:

StructPtr.IsUnique();

获取引用次数:

StructPtr.GetSharedReferenceCount();

如果共享指针对象离开所在作用域或者当作为类成员变量时,类示例对象析构时,会自动处理共享指针的计数,不需要手动重置。因为在对象析构时,会执行成员变量的析构方法,而共享指针中包含一个用于计数的对象,当共享指针析构时,会调用计数对象的析构方法。

2. TSharedRef

TSharedRef的用法与TSharedPtr大致相似,但与TSharedPtr相比,共享引用更加安全。因为引用不能为空,且无法置空,共享引用的初始化一般通过MakeShared或共享指针的ToSharedRef函数赋值,所以更加安全。一般在函数参数传递和作为返回值时使用,共享引用没有提供IsValid进行有效性判断,如果要判断有效性,可通过Get获取原生指针。

创建共享引用:

TSharedRef<TestStruct> StructRef = MakeShared<TestStruct>(new TestStruct());

共享指针转共享引用:

TSharedPtr<TestStruct> StructPtr = MakeShareable(new TestStruct());
TSharedRef<TestStruct> StructRef = StructPtr.ToSharedRef();

共享引用转共享指针可以直接赋值转换:

TSharedRef<TestStruct> StructRef = MakeShared<TestStruct>(new TestStruct());
TSharedPtr<TestStruct> StructPtr = StructRef;

3. TWeakPtr

TWeakPtr指针与TSharedPtr相比,不参与引用计数。而当TWeakPtr指向的对象不存在共享指针指向时,TWeakPtr将自动失效,所以在使用弱指针时,需要进行有效性判断。
初始化TWeakPtr:

TSharedPtr<TestStruct> StructPtr = MakeShareable(new TestStruct());
TWeakPtr<TestStruct> StructWeakPtr(StructPtr);

使用时,进行有效性判断:

if(StructWeakPtr.IsValid())
{
	StructPtr->Name = "Alter Name";
}

弱指针的Pin函数将会返回一个智能指针,所以弱指针转共享指针为:

TSharedPtr<TestStruct> StructPtr = MakeShareable(new TestStruct());
TWeakPtr<TestStruct> StructWeakPtr(StructPtr);
TSharedPtr<TestStruct> StructPtr2(StructWeakPtr.Pin());

4. TUniquePtr

唯一指针指向的对象只能被唯一指向,所以Unique指针不能赋值给其它指针。
创建TUniquePtr指针:

TUniquePtr<TestStruct> StructPtr = MakeUnique<TestStruct>(new TestStruct());

TUniquePtr指针还提供IsValid有效性判断和Reset重置函数。

5. TSharedFromThis

TSharedFromThis是一个模板类,普通C++函数继承TSharedFromThis类后,类将会保存一个弱指针,当通过智能指针获取到该类的普通指针时,可以通过调用AsShared方法获取到该类的智能指针。简而言之,继承该类的普通C++类可以将智能指针获得的普通指针再转为智能指针。

class FTestClass : TSharedFromThis<FTestClass>
{}

TSharedPtr<FTestClass> TestPtr = MakeShareable(new FTestClass());
FTestClass* TestNormalPtr = TestPtr.Get();
TSharedPtr<FTestClass> TestPtr2 = TestNormalPtr->AsShared();

注意:只有通过智能指针获取的普通指针才能使用AsShared转换为智能指针,否则可能崩溃。因为通过MakeShareable创建智能指针时,才会初始化其弱指针。

UE4面试基础知识(二) 1、在客户端是否可以获取到AIController? 不可以,在DS模型下,AIController只存在于服务端,其主要是通过在服务端对Pawn进行操控,然后再同步到客户端。 UE4 AIController 2、客户端上面能够执行RPC的对象有哪些? RPC(远程过程调用),是在本地调用但能在其他机器(不同于执行调用的机器)上远程执行的函数。 在客户端上能够执行RPG的对象需要满足: (1)该Actor必须被复制 (2)如果RPC是从客户端调用并在服务器上执行,客户端就必须拥有调用RPC的Actor。 阅读详情

相关推荐

UE4进阶:智能指针(一)

首先了解一下UE4中的Uobject,Uobject本身就可以回收和释放,基本上所有的类都继承自Uobject,所以引擎会自动释放。但如果不是继承自Uobject的类,可能就无法释放掉内存,甚至可能出现野指针问题。 UE4中的共享指针是TSharedPtr,使用格式为TsharedPtr name; 例如这里的一个类,不继承自Uobject,但是是AActor中的一部分。 class TaskA{ public: int32 a; float b; } class ATaskActor:public AA

weixin_42111061的博客 1188

智能指针的进化论:从UE4到UE5的内存管理哲学变迁

本文深入探讨了虚幻引擎从UE4到UE5智能指针系统的演进,重点分析了TObjectPtr在UE5中的革命性改进。通过对比TSharedPtr、TWeakPtr等传统智能指针,揭示了UE5在内存管理上的三大转变:类型安全强化、性能优化和编辑器集成。文章还提供了智能指针选型指南,帮助开发者在不同场景下做出最优选择。

weixin_29018815的博客 383

# UE4 智能指针

简介 虚幻智能指针库为C++11智能指针的虚幻自定义实现,用于非UObject的数据对象。 虚幻Objects使用更适合游戏代码的单独内存追踪系统,不适合用智能指针,请使用对象处理。 智能指针类型 TSharedPtr 共享指针:共享指针拥有其引用的对象,防止该对象被删除,并在无共享指针或共享引用(见下文)引用其时,删除该对象。共享指针可为空,意味其不引用任何对象。 非空共享指针可生成共享引用。...

ZhangjieZzJ的博客 5523

inl文件

inl文件:inl文件是内联函数的源文件。 内联函数通常在C++头文件中实现,但是当C++头文件中内联函数过多的情况下, 我们想使头文件看起来简洁点,像普通函数那样将内联函数声明和函数定义放在头文件和实现文件中, 具体做法将是:将内联函数的具体实现放在inl文件中,然后在该头文件末尾使用#include引入该inl文件。 //inl_demo.h #ifndef _INL_DEMO_H_ #define _INL_DEMO_H_ template<typename T> T return_max

qq_29667889的博客 5027

虚幻C++入门个人笔记(3)——接口、智能指针、动画蓝图、行为树、EQS系统

词义广泛,用来陈述功能、选项,与其他程序结构进行沟通的方式。接口抽象出了交互结构,提供了两个未知逻辑交互的便捷性。对于编程中,如何更好地设计低耦合程序起到了至关重要的作用。设计者可以在互不关心的情况下,进行友好的程序设计,并且通过接口来完成设计的整合交互虚幻引擎中加入了接口设计,从一定程度上“去掉了”多继承。接口可以帮助我们解决在不同类型的类之间却有相同行为的特性。接口设计增加了代码编写的便捷性(处理不同类中的相同行为)

hoppingg的博客 2558

虚幻引擎C++开发学习(二)上

虚幻引擎C++开发,通过组件对门增加互动功能: 包括利用触发体积开门和延迟关门; 公布组件参数,使得可以在虚幻引擎中调整参数,开关门的速度和角度参数。

packdge_black的博客 3616

【UEC++学习】UE中智能指针的使用基础

阐述UEC++智能指针的基础与使用

qq_45617648的博客 2714

虚幻4的智能指针

智能指针

虚幻4引擎工作室 2747

UE4 智能指针和弱指针

我们知道C++里面有自己的指针,但是在虚幻引擎中原生C++的指针在分配和释放内存时会产生一些问题,比如无法被虚幻进行回收,造成内存泄漏等问题,于是虚幻就衍生出了智能指针。是C++11智能指针的自定义实现,旨在减轻内存分配和跟踪的负担。此实现包括行业标准、和。它还添加了类似于不可为空的共享指针的共享引用这些类不能与UObject系统一起使用,因为虚幻对象使用单独的内存跟踪系统,该系统针对游戏代码进行了更好的调整。...

qq_43021038的博客 2686

IFRS 9与CECL对比解析:跨国企业财务必须掌握的两种信用损失模型

本文深度解析IFRS 9与CECL两种信用损失模型的差异,帮助跨国企业应对财务合规挑战。从基础架构、数据治理到监管策略,详细对比三阶段模型与单一阶段模型的核心区别,并提供实施双轨制的实务建议,助力企业优化资本管理和税务筹划。

3c4x5z6v7b的博客 668

PCB压合原理与工艺全流程深度解析

PCB压合是多层印制电路板制造中的核心工序,其本质并非简单物理叠加,而是高分子树脂流动、玻璃布应力释放、铜箔热膨胀及界面能调控的协同过程。理解压合原理,需掌握温度-压力-时间三维曲线动态关系;优化工艺流程,须兼顾叠板精度、热压参数匹配与冷却策略;关键影响因素如半固化片(PP)选型、铜箔表面处理、设备温场均匀性、结构对称性、环境湿度及操作手法,共同决定层间结合力、翘曲度与孔壁质量。本文围绕PCB压合原理、工艺流程、关键影响因素三大维度展开,融合IPC标准、实测数据与产线案例,为工艺工程师、NPI人员及设备维护

weixin_29191081的博客 253

UE 智能指针的介绍

智能指针 TSharedPtr, TSharedRef, TWeakPtr 的介绍,使用方法,相互转换及注意事项。

急需成长的路 2700

Mac上快速部署DeepSeek模型:Ollama终端操作全指南

本文详细介绍了在Mac上使用Ollama终端快速部署DeepSeek模型的完整指南。从硬件要求、Ollama安装、模型下载运行,到高级配置、可视化界面及常见问题解决,提供了全流程操作步骤与优化技巧,帮助开发者高效搭建本地AI助手,实现稳定、私密的离线使用体验。

weixin_29251567的博客 550

UE4 智能指针使用介绍

原创文章,转载请注明出处。 UE4也有一套智能指针库,整理了一下做个介绍。也请大家做补充。 共享指针/共享引用/弱指针/注意事项一.TSharePtr1.如何创建一个TSharePtr2.TSharePtr如何进行类型转换1)TSharePtr转TSharePtr2)Const TSharePtr转TSharePtr3)TSharePtr转TShareRef3.使用注意事项1)TSharePtr2)类型转换二.TShareRef1.如何创建一个TShareRef2.TShareRef如何进行类型转换1)TS

u011718663的博客 3万+

拆解汽车T-Box:从4G模块到MCU,手把手教你理解车联网的‘黑匣子’

本文深入拆解汽车T-Box,揭示其作为车联网‘黑匣子’的核心架构与工作原理。从4G模块、MCU主控到外设接口,详细解析各组件功能及协同机制,并通过实战案例展示故障诊断与性能优化技巧,帮助读者全面理解T-Box在智能汽车中的关键作用。

weixin_30955617的博客 492

Aras Innovator生命周期图实战:从配置到权限管理的全流程解析

本文详细解析了Aras Innovator生命周期图的全流程配置与权限管理,从基础概念到实战应用,涵盖状态设置、路径配置、权限控制等核心功能。通过实际案例和代码示例,帮助用户掌握如何高效管理数据生命周期,提升业务流程的规范性和效率。

ee345的博客 167

c++ 智能指针_虚幻4:智能指针基础

一、什么是智能指针?首先我们讲一下UE4中的UObjectUObject本身就可以帮我们做回收,做释放的。我们可以看到UE4中所有的类都是继承自UObject,这样的话当我们引擎被关闭的时候,它会帮我们自动释放这些资源,或者是我们手动去释放掉它,这样能保证能彻底删掉它。那么如果是原生的类呢?不是继承UObject的类,怎么办?我们会遇到这样的问题:我们创建这个资源,然后忘记把它删除,于是它占的内存...

weixin_39936134的博客 380

单细胞专题(1) | 单细胞转录组研究样本准备指南(上)

单细胞RNA测序(scRNA-seq)是目前最前沿,能进行大规模实验的转录组研究技术,为理解细胞组成和动态生物学过程提供了很多新的见解。单细胞研究已经为我们理解发育过程,老化和疾病(如癌症)等提供了大量数据。在这里,小编主要就前期的样本准备与保存需注意问题给大家进行讲解,以备大家在不同的研究场景和研究背景下,走好单细胞转录组学研究的第一步。

bioyigene的博客 4229

UE4智能指针学习记录

UE4智能指针 之前的博客《实现一个最基础的智能指针》里实现了一个最简单的使用引用计数方式的智能指针。而UE4也有一套智能指针的实现,可见《虚幻智能指针库 | Unreal Engine Documentation》中的介绍。 另外,我发现\Engine\Source\Runtime\Core\Public\Templates\SharedPointer.h中的注释也有很多有价值的信息,可以补充参考。 注释中的信息 This is a smart pointer library consisting of

主要记录了工作之余胡乱学习的知识,大部分是入门级别的内容。 主要是为了自己未来有用到时能快速上手,相当于是个备忘录。 当然,也很开心其他人可以从中找到对自己有用的信息。^_^ 3221

CSP-J 入门级第一轮认证 2025 详细解析

2025年CSP-J入门级第一轮认证模拟赛提供10套免费试题,含选择题与解析。选择题涉及计算机科学基础,如32位无符号整数最大值计算(约42.9亿,选A)、C++位运算(255&254=254,选B)、递归函数分析(calc(5)=6,选B)、哈夫曼树构造(带权路径长度186,选B)等。其他题目涵盖图论(有向图边数等于入度/出度和,选B)、组合数学(120种选法,选C)、布尔逻辑(选项C不恒等)、模运算周期性(f[2025]=6,选D)、C++字符串特性(支持string+char,选B)及引用传参

lan_in的博客 2939

华为OD机试 - 敌情监控 - 滑动窗口(Java 双机位C卷 200分)

说明 第一行第一个正整数5,表示敌人有5个营地,第二个正整数2,表示连续营地 的数量是2, 第3个正整数3, 表示后续会有3条查询的命令;接下来一行有 5个正整数,分别表示每个营地里开始的人的数,第1个营地开始有1个人,第 2个营地开始有2个人,第3个营地开始有2个人,第4个营地开始有3个人,第 5 个营地开始有3个人;第3条命令:Query 2 4 表示查询第2到第4个营地的总人数,结果:2+8=10 第一个输出是: 10,注意这里第3个营地人数在第2条命令中增加了6。第一行3个正整数:N K L。

学Java,找哪吒 764

UE4中的智能指针

智能指针库:减轻内存分配与追踪负担 ,C++11中智能指针的定义实现 共享指针TSharedPtr 共享引用 TSharedRef(不可为空) 弱指针 TWeakPtr 助手类与函数 助手类与函数 MakeShareable()-用于从C ++指针初始化共享指针(启用隐式转换) TSharedFromThis-您可以从this派生自己的类,以从“ this”获取TSharedRef StaticCastSharedRef()-静态转换实用工具函数,通常用于向下转换为派生类型。 ConstCastSha

qq_29667889的博客 2117

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

[UE4]共享指针

共享指针 本页面的内容: 声明和初始化 解引用和访问 比较 转换 共享指针 是一种非侵入式的、引用计数的特殊类型智能指针,它既支持强引用也支持弱引用。共享指针本身包含了基本智能指针所有的优点,它们可以防止内存泄露、防止存在未初始化的内存等,同时还有一些额外功能,比如: 共享所有权 - 引用计数 自动失效 - 可以安全地引用易发生变化的对象 弱引用 - 允许通过弱...

qq173681019的博客 1903

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

UE4 智能指针

简介 虚幻智能指针库为C++11智能指针的虚幻自定义实现,用于非UObject的数据对象。 虚幻Objects使用更适合游戏代码的单独内存追踪系统,不适合用智能指针,请使用对象处理。 智能指针类型 TSharedPtr 共享指针:共享指针拥有其引用的对象,防止该对象被删除,并在无共享指针或共享引用(见下文)引用其时,删除该对象。共享指针可为空,意味其不引用任何对象。 非空共享指针可生成共享引用。 ...

lixpjita39的专栏 1727

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

UE4c++的各类指针使用方法

1. 智能指针 TSharedPtr 智能指针TsharedPtr是虚幻自己定义的的指针类型, 用于内存管理,但是继承于UObject的类不需要用智能指针, 用普通的指针就行, 因为继承于UObject的内存回收是靠虚幻自己的GC系统回收的,只有不继承Uobject的类才需要用智能指针,用智能指针去回收。例如Slate等。。。 //声明一个智能指针 Tsharedptr<MyClass> TestPtr; //给共享指针赋值 效率低 但即使对象构造为 私有的仍可以运行 SharedPtr =

qq_40756668的博客 2961

UE4 共享指针源码浅析

本文章只是我个人在学习虚幻智能指针过程中的理解,不一定正确,若有说的不对的地方,欢迎指正。根据源码里面的注释可以看出,UE4智能指针借鉴了C++自带的 std:shared_ptr,但由于一些平台并不支持C++的智能指针,因此,虚幻官方开发者重新写了一套智能指针,它基本支持市面上所有你能看到的平台,而且还与UE自身提供的容器无缝衔接,熟练使用它能避免出现使用普通指针会出现的一些问题。

m0_53295313的博客 590
上一篇: 【UE4】编辑器开发(七)模型导入与映射
下一篇: 【C++】常用技巧
Im 胡嘿嘿
博客等级 码龄10年 148粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值