c++智能指针unique_ptr的使用

目录

  • 1.为什么需要unique_ptr
  • 2.什么是unique_ptr
  • 3.unique_ptr特性
  • 4.如何使用unique_ptr
    • 4.1简单使用
    • 4.2指向数组
  • 5.unique_ptr需要注意什么
    【c++智能指针unique_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需要引入

    3.unique_ptr特性 unique_ptr禁用了拷贝构造以及赋值操作,也就导致了下面的这些操作无法完成。
    void testFunction(std::unique_ptr 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 t(new Test); std::unique_ptr t2 = t; //编译报错std::unique_ptr t3(t); //编译报错testFunction(t); //编译报错}


    4.如何使用unique_ptr
    4.1简单使用
    void simpleUse(){Test *test = new Test; std::unique_ptr t(test); qDebug() << test<<"获取原始指针"<< t.get() <getString(); std::unique_ptr t2 = std::move(t); //交换使用权到t2; t2->getString(); }

    c++智能指针unique_ptr的使用
    文章图片


    4.2指向数组
    和shared_ptr需要注意的地方一样,指向数组时要注意模板书写的方式,以及如何使用自定义删除器
    错误写法:会导致内存泄露
    void customRemover(){std::unique_ptr t(new Test[5]); }

    c++智能指针unique_ptr的使用
    文章图片

    正确写法:
    void customRemover(){std::unique_ptr t(new Test[5]); std::unique_ptr p2(new Test[5],[](Test *t){delete []t; }); }


    5.unique_ptr需要注意什么 不要多个unique_ptr指向同一个对象
    例如:
    void repeatPointsTo(){Test *test = new Test; std::unique_ptr t(test); std::unique_ptr t2(test); //两个unique_ptrzhi'xi指向同一个对象,会导致这个对象被析构两次,导致问题出现}

    c++智能指针unique_ptr的使用
    文章图片


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

      推荐阅读