c++智能指针unique_ptr的使用

 更新时间:2021年12月26日 16:15:35   作者:鶸鶸19960712  
本文主要介绍了c++智能指针unique_ptr的使用,与shared_ptr作用类似,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

1.为什么需要unique_ptr

与shared_ptr作用类似,需要解决内存泄漏的问题,但是却不需要使用shared_ptr的引用计数,所以为了减少消耗,就需要一个这样的智能指针。但是使用已被废弃的auto_ptr的话就会有新的问题,auto_ptr在使用过程中如果被拷贝构造或者赋值的话,被复制的auto_ptr就失去了作用,这个时候就需要在auto_ptr的基础上禁用拷贝构造以及赋值操作,也就成了unique_ptr。

2.什么是unique_ptr

一个unique_ptr独享它指向的对象。也就是说,同时只有一个unique_ptr指向同一个对象,当这个unique_ptr被销毁时,指向的对象也随即被销毁。使用unique_ptr需要引入<memory.h>

3.unique_ptr特性

unique_ptr禁用了拷贝构造以及赋值操作,也就导致了下面的这些操作无法完成。

void testFunction(std::unique_ptr<Test> t){
    t->getString();
}

void features(){
    // Disable copy from lvalue.
    //    unique_ptr(const unique_ptr&) = delete;
    //    unique_ptr& operator=(const unique_ptr&) = delete;
    //不能进行拷贝构造以及赋值运算,也就表示不能作为函数参数传递
     std::unique_ptr<Test> t(new Test);
     std::unique_ptr<Test> t2 = t; //编译报错
     std::unique_ptr<Test> t3(t);//编译报错
     testFunction(t);//编译报错
}

4.如何使用unique_ptr

4.1简单使用

void simpleUse(){
    Test *test = new Test;
    std::unique_ptr<Test> t(test);
     qDebug() << test  <<"获取原始指针"<< t.get() <<endl;
     
    //    t.release(); //释放其关联的原始指针的所有权,并返回原始指针,没有释放对象
    //    t.reset();// 释放对象
    t->getString();

    std::unique_ptr<Test> t2 = std::move(t); //交换使用权到t2;
    t2->getString();
}

运行结果

4.2指向数组

和shared_ptr需要注意的地方一样,指向数组时要注意模板书写的方式,以及如何使用自定义删除器

错误写法:会导致内存泄露

void customRemover(){
    std::unique_ptr<Test> t(new Test[5]);
}

错误方法输出

正确写法:

void customRemover(){
    std::unique_ptr<Test[]> t(new Test[5]);
    
    std::unique_ptr<Test, void(*)(Test *)> p2(new Test[5],[](Test *t){
        delete []t;
    });
}

5.unique_ptr需要注意什么

不要多个unique_ptr指向同一个对象
例如:

void repeatPointsTo(){
    Test *test = new Test;
    std::unique_ptr<Test> t(test);
    std::unique_ptr<Test> t2(test);
    //两个unique_ptrzhi'xi指向同一个对象,会导致这个对象被析构两次,导致问题出现
}

运行结果

会导致对象会被多次析构,导致崩溃

到此这篇关于c++智能指针unique_ptr的使用的文章就介绍到这了,更多相关c++智能指针unique_ptr内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言字符串左旋的两种实现方法

    C语言字符串左旋的两种实现方法

    汇编语言中有一种移位指令叫做循环左移(ROL),下面这篇文章主要给大家介绍了关于C语言字符串左旋的两种实现方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • 深入理解Qt 智能指针

    深入理解Qt 智能指针

    智能指针是一种特殊的指针,可以自行管理和释放资源,防止内存泄漏和悬挂指针,本文主要介绍了深入理解Qt 智能指针,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • C语言长字符串的换行方法详解

    C语言长字符串的换行方法详解

    在编写C程序时,如果想要打印某个字符串,而字符串的内容比较多,这就涉及到对这个长字符串进行书写换行,本片文章就带你了解一下
    2021-09-09
  • C++ 虚函数和纯虚函数的区别分析

    C++ 虚函数和纯虚函数的区别分析

    这篇文章主要介绍了C++ 虚函数和纯虚函数的区别,帮助大家更好的理解和学习c++的相关知识,感兴趣的朋友可以了解下
    2020-10-10
  • C++实现商店仓库管理系统

    C++实现商店仓库管理系统

    这篇文章主要为大家详细介绍了C++实现商店仓库管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • C语言手写多级时间轮定时器

    C语言手写多级时间轮定时器

    这篇文章主要为大家详细介绍了如何利用C语言实现手写多级时间轮定时器,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下
    2022-09-09
  • VisualStudio2022下配置 OpenMP多线程编程环境与运行

    VisualStudio2022下配置 OpenMP多线程编程环境与运行

    本文主要介绍了VisualStudio2022下配置 OpenMP多线程编程环境与运行,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06
  • C语言实现班级学生管理系统

    C语言实现班级学生管理系统

    这篇文章主要为大家详细介绍了C语言实现班级学生管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • C语言实战之纸牌游戏

    C语言实战之纸牌游戏

    这篇文章主要为大家介绍了通过C语言实现的纸牌游戏的示例代码,文中的示例代码讲解详细,对我们学习C语言有一定的帮助,感兴趣的小伙伴可以跟随小编学习一下
    2021-12-12
  • C++根据传入的函数指针来解析需要的参数(推荐)

    C++根据传入的函数指针来解析需要的参数(推荐)

    C++可以根据传入的函数指针,获取自己需要的参数类型,然后根据参数源中获取需要的参数,具体实现方式大家参考下本文
    2018-05-05

最新评论