当前位置: 首页 > news >正文

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 的直接调用,避免裸指针的使用,使代码更现代化和安全。

相关文章:

  • ESP8266发送WOL幻数据包实现电脑远程唤醒
  • <router-view />标签的理解
  • mysql预置的数据库
  • 微服务迁移、重构最佳经验
  • Effective C++ 改善程序与设计的55个具体做法笔记与心得 4
  • 【笔记】复制Edge的网址粘贴后自动变成中文标题超链接
  • ChatGPT中文镜像网站分享
  • 【镜像制作】制作k8s的yaml配置的备份镜像
  • C++初学者指南第一步---10.内存(基础)
  • Hive笔记-3
  • OpenCV--Mat属性和深浅拷贝
  • 前端开发之浏览器垃圾回收机制
  • Redis分片集群搭建
  • springBoot+mongoDB项目中,使用MongoFactory、MongoTemplate分页条件查询,增删查改
  • 代码随想三刷二叉树篇3
  • @jsonView过滤属性
  • Java多态
  • js递归,无限分级树形折叠菜单
  • Node 版本管理
  • ReactNativeweexDeviceOne对比
  • tab.js分享及浏览器兼容性问题汇总
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • vue:响应原理
  • vue的全局变量和全局拦截请求器
  • 从0到1:PostCSS 插件开发最佳实践
  • 简单易用的leetcode开发测试工具(npm)
  • 如何设计一个微型分布式架构?
  • 使用权重正则化较少模型过拟合
  • 智能合约Solidity教程-事件和日志(一)
  • ## 1.3.Git命令
  • #android不同版本废弃api,新api。
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (13):Silverlight 2 数据与通信之WebRequest
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (SERIES12)DM性能优化
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (六)c52学习之旅-独立按键
  • (四)汇编语言——简单程序
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转) ns2/nam与nam实现相关的文件
  • (转)C#调用WebService 基础
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)fock函数详解
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • ******之网络***——物理***
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .net core 管理用户机密
  • .NET IoC 容器(三)Autofac
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .NET 中让 Task 支持带超时的异步等待