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

【C++11新特性】 C++11智能指针之 unique_ptr

在前面一篇文章中,我们了解了 C++11 中引入的智能指针之一 shared_ptr 和 weak_ptr ,今天,我们来介绍一下另一种智能指针 unique_ptr 。

往期文章参考:

  1. 【C++11新特性】 C++11 智能指针之shared_ptr

  2. 【C++11新特性】 C++11智能指针之weak_ptr

unique_ptr介绍

unique是独特的、唯一的意思,故名思议,unique_ptr可以“独占”地拥有它所指向的对象,它提供一种严格意义上的所有权。

这一点和我们前面介绍的 shared_ptr 类型指针有很大的不同:shared_ptr 允许多个指针指向同一对象,而 unique_ptr 在某一时刻只能有一个指针指向该对象。

unique_ptr 保存指向某个对象的指针,当它本身被删除或者离开其作用域时会自动释放其指向对象所占用的资源。

1、如何创建unique_ptr

unique_ptr 不像shared_ptr一样拥有标准库函数make_shared来创建一个shared_ptr实例。

要想创建一个 unique_ptr,我们需要将一个 new 操作符返回的指针传递给unique_ptr的构造函数。

示例:

int main() {
    // 创建一个unique_ptr实例
    unique_ptr<int> pInt(new int(5));
    cout << *pInt;
}

2、无法进行复制构造和赋值操作

unique_ptr没有 copy 构造函数,不支持普通的拷贝和赋值操作。

示例:

int main() {
    // 创建一个unique_ptr实例
    unique_ptr<int> pInt(new int(5));
    unique_ptr<int> pInt2(pInt);    // 报错
    unique_ptr<int> pInt3 = pInt;   // 报错
}

3、可以进行移动构造和移动赋值操作

unique_ptr虽然没有支持普通的拷贝和赋值操作,但却提供了一种移动机制来将指针的所有权从一个unique_ptr转移给另一个unique_ptr。

如果需要转移所有权,可以使用std::move()函数。

示例:

int main() {
    unique_ptr<int> pInt(new int(5));
    unique_ptr<int> pInt2 = std::move(pInt);    // 转移所有权
    //cout << *pInt << endl; // 出错,pInt为空
    cout << *pInt2 << endl;
    unique_ptr<int> pInt3(std::move(pInt2));
}

4、可以返回unique_ptr

unique_ptr不支持拷贝操作,但却有一个例外:可以从函数中返回一个unique_ptr。

示例:

unique_ptr<int> clone(int p)
{
    unique_ptr<int> pInt(new int(p));
    return pInt;    // 返回unique_ptr
}

int main() {
    int p = 5;
    unique_ptr<int> ret = clone(p);
    cout << *ret << endl;
}

unique_ptr使用场景

1、为动态申请的资源提供异常安全保证

我们先来看看下面这一段代码:

void Func()
{
    int *p = new int(5);

    // ...(可能会抛出异常)

    delete p;
}

这是我们传统的写法:当我们动态申请内存后,有可能我们接下来的代码由于抛出异常或者提前退出(if语句)而没有执行delete操作。

解决的方法是使用unique_ptr来管理动态内存,只要unique_ptr指针创建成功,其析构函数都会被调用。确保动态资源被释放。

void Func()
{
    unique_ptr<int> p(new int(5));

    // ...(可能会抛出异常)
}

2、返回函数内动态申请资源的所有权

示例如下:

unique_ptr<int> Func(int p)
{
    unique_ptr<int> pInt(new int(p));
    return pInt;    // 返回unique_ptr
}

int main() {
    int p = 5;
    unique_ptr<int> ret = Func(p);
    cout << *ret << endl;
    // 函数结束后,自动释放资源
}

3、在容器中保存指针

int main() {
    vector<unique_ptr<int>> vec;
    unique_ptr<int> p(new int(5));
    vec.push_back(std::move(p));    // 使用移动语义
}

4、管理动态数组

标准库提供了一个可以管理动态数组的unique_ptr版本。

int main() {
    unique_ptr<int[]> p(new int[5] {1, 2, 3, 4, 5});
    p[0] = 0;   // 重载了operator[]
}

作者:Fred^_^

原文:https://blog.csdn.net/Xiejingfa/article/details/50759210

推荐阅读:

慕课网录制的视频上线啦~~~

移动端技术交流喊你入群啦~~~

推荐几个堪称教科书级别的 Android 音视频入门项目

音视频面试基础题

OpenGL 之 GPUImage 源码分析

觉得不错,点个在看呗~

相关文章:

  • 关于JVM,你必须知道的那些玩意儿
  • OpenGL ES 实现动态(水波纹)涟漪效果
  • 盘点Android常用Hook技术
  • 推荐一款强大的 Android OpenGL ES 调试工具
  • MediaCodec 解码后数据对齐导致的绿边问题
  • JNI编程如何巧妙获取JNIEnv
  • 最新 Android 面试点梳理,我收藏了你呢?
  • 三年Android开发,跳槽腾讯音乐,历经三面终获Offer,定级T2-1(超全面试题+学习经验总结)...
  • 「Android音视频编码那点破事」序章
  • Android短文:理解插值器和估值器
  • 用户调研:音视频方面的书籍,哪些内容才是你需要的?
  • 职场PUA到底有多可怕?
  • Fragment 的过去、现在和将来
  • 数字图像处理领域中常见的几种色彩模式
  • Android VSYNC (Choreographer)与UI刷新原理分析
  • Java 多线程编程之:notify 和 wait 用法
  • Javascript 原型链
  • JS 面试题总结
  • Laravel 中的一个后期静态绑定
  • MobX
  • nodejs实现webservice问题总结
  • session共享问题解决方案
  • Shadow DOM 内部构造及如何构建独立组件
  • vue学习系列(二)vue-cli
  • WebSocket使用
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 从零开始学习部署
  • 大快搜索数据爬虫技术实例安装教学篇
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 记一次删除Git记录中的大文件的过程
  • 看域名解析域名安全对SEO的影响
  • 那些被忽略的 JavaScript 数组方法细节
  • 手写一个CommonJS打包工具(一)
  • 小程序开发中的那些坑
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 一、python与pycharm的安装
  • 用Visual Studio开发以太坊智能合约
  • HanLP分词命名实体提取详解
  • 容器镜像
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • (10)ATF MMU转换表
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (windows2012共享文件夹和防火墙设置
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (九)One-Wire总线-DS18B20
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转载)Linux网络编程入门
  • .gitattributes 文件
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .net FrameWork简介,数组,枚举
  • .NET分布式缓存Memcached从入门到实战
  • .NET文档生成工具ADB使用图文教程
  • .Net语言中的StringBuilder:入门到精通