IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++(UE4) Memory Management Review -> 正文阅读

[C++知识库]C++(UE4) Memory Management Review

以下是关于 C++(UE4) 内存管理的一点简单分享

原始方式(Raw)

在这里插入图片描述

  • malloc/free 是 C 中用于分配内存和释放内存的主要方式
  • new/delete 是 C++ 中用于分配内存和释放内存的主要方式,除了内存管理之外, new/delete 还负责调用对象的构造函数和析构函数
  • new[]/delete[] 是 new/delete 的数组形式
  • 比较重要的一点是, new/delete 等内存管理的调用一定要匹配,譬如调用了 new 就一定要调用 delete(而不能 不调用 delete 或者调用 free 等不匹配的内存操作)

在这里插入图片描述

  • new 运算符表达式基本分为两步操作,首先调用 operator new 函数分配内存,然后在该内存处调用对象的构造函数
  • delete 运算符表达式基本也分为两步操作,首先调用对象的析构函数,然后调用 operator delete 函数释放对象的内存
  • operator new 与 operator delete 可以定制重载
  • UE4 进行了自己的重载工作(通过宏等方式)

在这里插入图片描述

  • new 还有一些"变种"操作,譬如 placemenet new 等等,更多信息可以在这里找到

正常方式(Normal)

在这里插入图片描述

  • 原始的内存管理方式存在很多问题,譬如逻辑控制上很难做到没有遗漏,而且让程序员人为的保证调用的匹配本身也非常困难
  • 借助值语义对象的构造函数和析构函数可以帮助我们改善这个问题

在这里插入图片描述

  • 这种方式有个专用名词: RAII

在这里插入图片描述

  • 这是一段代码示例,示例中通过 lock_guard 来保证 mutex 能正确的 lock 和 unlock(即使程序逻辑提前返回或者产生异常)

智能指针

在这里插入图片描述

  • 将 RAII 的概念运用于 指针 上,便形成了智能指针的概念
  • C++ 先前有 std::auto_ptr 这种智能指针,但在规范上却混淆了移动和复制语义,所以存在很多问题, C++17
    已经将 std::auto_ptr 移除
  • 目前 C++ 的智能指针分为: std::unique_ptr, std::shared_ptr 和 std::weak_ptr 这三种类型

在这里插入图片描述

  • 智能指针中较常用的是 std::shared_ptr
  • 关于 std::shared_ptr 有个相关的类型 std::enable_shared_from_this,这个类型的主要目的是为了解决复用 std::shared_ptr 时存在的重复释放问题

在这里插入图片描述
在这里插入图片描述

  • std::enable_shared_from_this 示例代码

GC

在这里插入图片描述

  • C++ 标准目前不支持 GC

在这里插入图片描述

  • UE4 目前采用 Mark-Sweep 来进行 GC
  • UE4 GC 适用于 UObject 类型, 对于非 UObject 类型,需要继承 FGCObject 类型
  • UObject 不适用于 C++ 概念中的智能指针(但适用于 UE4 扩展的一些智能指针类型,譬如 TWeakObjectPtr 等等)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • UObject 需要借助一些方式来保持 GC 引用

结论

在这里插入图片描述

  • 对于非 GC 类型,你可以直接使用原始方式来进行内存管理(消耗最小),但是你需要处理好相关的内存问题
  • 但更一般的,还是建议你使用智能指针(譬如 std::shared_ptr) 来管理非 GC 类型
  • 对于 GC(主要指 UObject) 类型,小心处理相关的引用关系
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-16 11:33:49  更:2021-08-16 11:35:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/26 16:42:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计