C++ 智能指针:unique_ptr

深刻理解一个原理的方法之一就是去自我实现一个,上代码:

1 自定义unique_ptr

#include <iostream>
#include <utility>template<typename T>
class unique_ptr {
private:T * ptr_resource = nullptr;public:explicit unique_ptr(T* raw_resource) noexcept : ptr_resource(std::move(raw_resource)) {}unique_ptr(std::nullptr_t) : ptr_resource(nullptr) {}unique_ptr() noexcept : ptr_resource(nullptr) {}~unique_ptr() noexcept {delete ptr_resource;}unique_ptr(const unique_ptr<T>&) noexcept = delete;unique_ptr& operator = (const unique_ptr&) noexcept = delete;public:unique_ptr(unique_ptr&& move) noexcept {std::cout << "construct for unique_ptr&&" << std::endl;move.swap(*this);}unique_ptr& operator=(unique_ptr&& move) noexcept {std::cout << "operator= for unique_ptr&&" << std::endl;move.swap(*this);return *this;}explicit operator bool() const noexcept {return this->ptr_resource;}T* release() noexcept {return std::exchange(ptr_resource, nullptr);}T* get() const noexcept {return ptr_resource;}void swap(unique_ptr<T>& resource_ptr) noexcept {std::swap(ptr_resource, resource_ptr.ptr_resource);}void reset(T* resource_ptr) noexcept(false) {if (resource_ptr == nullptr)throw std::invalid_argument("An invalid pointer was passed, resources will not be swapped");delete ptr_resource;ptr_resource = nullptr;std::swap(ptr_resource, resource_ptr);}
public:T * operator->() const noexcept {return this->ptr_resource;}T& operator*() const noexcept {return *this->ptr_resource;}
};class UClass {
public:UClass() {std::cout << "UClass class construct" << std::endl;}~UClass() {std::cout << "UClass class destruct" << std::endl;}void printWithoutResource() {std::cout << "UClass printWithoutResource " << std::endl;}void printResource() {std::cout << "UClass printResource " << res << std::endl;}int getResource() {return res;}private:int res = 10;
};class UTest {
public:UTest() {pTest.reset(new UClass());std::cout << "UTest construct " << std::endl;}~UTest() {std::cout << "UTest destruct" << std::endl;}void userTest() {std::cout << "userTest " << pTest->getResource() << std::endl;}private:unique_ptr<UClass> pTest;
};int main() {unique_ptr<UClass> tPtr1(new UClass());unique_ptr<UClass> tPtr3(std::move(tPtr1));unique_ptr<UClass> tPtr4 = std::move(tPtr3);//tPtr1->printResource(); tPtr1->printWithoutResource();  UTest* pUTest = new UTest();pUTest->userTest();return 0;
}

2 std::make_unique

std::make_unique 是 C++11 标准库中的一个实用函数,它是 C++14 标准中引入的,用于创建一个 std::unique_ptr 智能指针,并将其指向一个新分配的对象。

使用 std::make_unique 比直接使用 new 表达式更为安全,因为它可以防止资源泄漏,并提供异常安全保证。

std::unique_ptr 是一个模板类,它提供了对动态分配对象的独占所有权(即没有其他智能指针可以同时拥有同一个对象的所有权)。当 std::unique_ptr 被销毁时,它所指向的对象也会被自动删除。

使用 std::make_unique 的好处如下:

异常安全:如果在构造对象时发生异常(比如在构造参数时),已分配的内存会被自动回收,这样就不会发生内存泄漏。

简洁的语法:使用 std::make_unique 能用一行代码完成智能指针的创建和对象的初始化。

避免使用裸指针:使用 std::make_unique 可以减少对 newdelete 的直接调用,避免裸指针的使用,使代码更现代化和安全。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/31597.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试官:JavaScript执行机制中的闭包?

前言 JavaScript 中的闭包指的是一个函数以及其捆绑的周边环境状态的引用的组合。闭包可以让开发者从内部函数访问外部函数的作用域&#xff0c;即使外部函数已经执行完毕 今天我们通过JavaScript执行机制来聊聊闭包 正文 首先来分析这段代码的执行机制&#xff0c;这段代码…

详细解读“找不到mfc140u.dll无法继续执行代码”问题

当你打开某个软件或者运行游戏&#xff0c;系统提示mfc140u.dll丢失&#xff0c;此时这个软件或者游戏根本无法运行。其实&#xff0c;mfc140u.dll是动态库文件&#xff0c;它是VS2010编译的软件所产生的&#xff0c;如果电脑运行程序时提示缺少mfc140u.dll文件&#xff0c;程序…

PHP 8.4有哪些新功能值得关注

属性钩子&#xff08;Property Hooks&#xff09; 允许开发者为每个属性定义自己的get和set钩子&#xff0c;以在属性访问前后添加自定义逻辑。属性钩子通过__get()和__set()方法实现&#xff0c;类似于其他编程语言&#xff08;如Kotlin、C#和Swift&#xff09;中的属性访问器…

C++标准库:STL以及输入输出库,IO库,Cmath库,时间库,智能指针库与并发库等简介

标准库 C 标准库是 C 编程语言的核心部分&#xff0c;提供了丰富的功能和组件&#xff0c;包括容器、算法、迭代器、函数对象、智能指针、输入输出操作等。C 标准库主要包括以下几个组件&#xff1a; STL&#xff08;Standard Template Library&#xff09;&#xff1a;STL 是…

复分析——第6章—— Γ 函数和 ζ 函数(E.M. Stein R. Shakarchi)

第6章 Γ函数和Ζ函数(The Gamma and Zeta Functions) 毫不夸张地说&#xff0c;Γ函数和Ζ函数是数学中最重要的非初等函数之一。Γ函数在自然界中无处不在。它出现在大量计算中&#xff0c;并以分析中出现的大量恒等式为特征。对此的部分解释可能在于Γ函数的基本结构特性&…

游戏心理学Day21

玩家情绪与暴力攻击 情绪 情绪的分类 情绪是一种经常波动的东西&#xff0c;我们既体验过骄傲激动和开心&#xff0c;也体验过羞怯内疚和沮丧。我们的感受高度依赖于情境。研究者区分出至少三种途径来考察作为一种相对固定的人格特征的情绪&#xff0c;即为情感性&#xff0…

lock_wait_timeout

lock_wait_timeout 是 MySQL 中的一个重要参数&#xff0c;它用于控制当一个 MySQL 会话在等待锁时的等待时间。以下是关于 lock_wait_timeout 的详细解释&#xff1a; 定义与功能 定义&#xff1a;lock_wait_timeout 是一个会话或线程级别的参数&#xff0c;用于指定 MySQL …

python20 函数的定及调用

函数的定及调用 函数是将一段实现功能的完整代码&#xff0c;使用函数名称进行封装&#xff0c;通过函数名称进行调用。以此达到一次编写&#xff0c;多次调用的目的 用 def 关键字来声明 函数 格式&#xff1a; def 函数名(参数列表):函数体[:return 返回值是可选的&#xff0…

小白如何如何理解滑动窗口最大值问题python

文章目录 题目描述思路什么时候弹出元素什么时候加入元素 代码示例和解释 题目描述 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 举例&#xff1a; 输…

命令行脚本批量转换工具说明

O N C E &#xff0c; ONCE&#xff0c; ONCE&#xff0c;EACH&#xff0c;$0都是NimbleText的关键字 O N C E : 任何 在 ′ ONCE:任何在 ONCE:任何在′ONCE’关键字之后的文本将只输出一次&#xff0c;不管有多少行&#xff0c;到’$EACH’关键字或者到文件末尾为止。 E A C…

《沃趣 分手后霸道少爷宠爆我》盛大开机典礼

南京五聚文化传媒有限公司自豪地宣布&#xff0c;引人入胜的2024年度短剧巨作——《沃趣 分手后霸道少爷宠爆我》——今日正式开拍&#xff01;在星辰下的华丽舞台上&#xff0c;我们汇集了业界的精英力量&#xff0c;准备讲述一个关于爱、错位与重生的故事。 典礼精彩亮点 1.…

0621熟悉项目

1、store:全局状态管理器。共享给各组件的数据。 2、首页组件组成&#xff1a;layout组件下的index为入口。左侧菜单栏SidebarNew&#xff08;大概意思是遍历数组生成菜单&#xff09;&#xff0c;右侧菜单栏app-mai&#xff08;主体内容&#xff09; main-tags-view&#xff0…

数据治理工程师CDGA备考心得、时间安排、题库资源

1.写在前面 之前做一些数据质量控制、元数据、主数据相关工作&#xff0c;一直忙于工作&#xff0c;没有去往考证的方面想&#xff0c;去年年底心血来潮就决定考一考&#xff0c;证多不压身嘛&#xff08;也有部分学生向我咨询&#xff09;&#xff0c;资源在文章结尾&#xff…

逻辑学中的蕴涵式:SQL开发者必备知识

逻辑学中的蕴涵式&#xff1a;SQL开发者必备知识 在逻辑学中&#xff0c;蕴涵式&#xff08;Implication&#xff09;是一种常见的逻辑关系&#xff0c;用于描述两个命题之间的条件关系。在SQL开发中&#xff0c;理解蕴涵式的概念和真值规则对编写复杂查询语句非常有帮助。本文…

onnx转openvino模型(2022版本和2024版本)

网上很多方法都是用openvino自带的mo_onnx.py来转的&#xff0c;但个人下载的2022和2024版都没见到这些文件。所以使用不了 &#xff08;1&#xff09;2022版openvino&#xff1a;python需要安装对应版本的openvino库(以2022.3.0为例&#xff09; pip install openvino2022.3…

软件测试——稳定性测试:adb Monkey

Monkey 1. Monkey1.1 Monkey 是什么1.2 Monkey 测试场景1.3 Monkey 特点1.4 Monkey 在哪里1.5 测试准备事项1.6 Monkey 参数列表 2. 基本命令3. 常用参数4. 事件类型5. 调试参数6. 日志管理7. 日志错误定位8. Monkey测试可以发现的问题 1. Monkey 1.1 Monkey 是什么 Monkey是一…

MySQL笔记——事务

事务 **控制事务****并发事务问题**事务隔离级别 学习黑马MySQL课程&#xff0c;记录笔记&#xff0c;用于复习。 控制事务 方式一&#xff1a; #查看和设置事务提交方式 select autocommit ; set autocommit 0 ; #提交事务 commmit; #回滚事务 rollback;方式二&#xff1a;…

electron自定义标题栏的最大化,最小化,关闭窗口

渲染组件代码&#xff1a; <template><div class"window-btn"><i class"minimize" click"minimize"><img src"../assets/img/最小化.svg" alt"最小化" /></i><i v-if"!isMaximized&…

react 0至1 案例

/*** 导航 Tab 的渲染和操作** 1. 渲染导航 Tab 和高亮* 2. 评论列表排序* 最热 > 喜欢数量降序* 最新 > 创建时间降序* 1.点击记录当前type* 2.通过记录type和当前list中的type 匹配*/ import ./App.scss import avatar from ./images/bozai.png import {useState} …

【408考点之数据结构】队列:定义、特点、基本操作与应用

队列&#xff1a;定义、特点、基本操作与应用 队列的定义 队列&#xff08;Queue&#xff09;是一种特殊的线性表&#xff0c;仅允许在一端进行插入操作&#xff08;称为队尾&#xff0c;Rear&#xff09;&#xff0c;在另一端进行删除操作&#xff08;称为队头&#xff0c;F…