zoukankan      html  css  js  c++  java
  • 智能指针unique_ptr的使用

    定义

    template<class T, class Deleter = std::default_delete<T>> class unique_ptr;
    
    template <class T, class Deleter> 
    class unique_ptr<T[], Deleter>;
    

    std::unique_ptr 是通过指针占有并管理另一对象, 并在unique_ptr离开作用域时释放该对象的智能指针。

    释放对象的时机-> :

    1. 销毁了管理的unique_ptr对象
    2. 通过operator=reset() 赋值另一指针给管理的 unique_ptr对象

    也可以通过调用get_deleter()(ptr) 删除对象;

    unique_ptr 是可以转义对象的管理权的,但是被const修饰之后就不能够被转移了

    常用的成员函数

    函数名字 作用
    operator= 赋值
    reset 替换被管理对象
    swap 交换被管理对象
    release 返回被管理对象的指针,并且释放一个对象所有权
    get 返回被管理对象的指针

    常用的非成员函数

    函数名字 作用
    make_unique 创建一个管理对象的独占指针
    std::swap(std::unique_ptr) 特化 std::swap 算法

    示例代码

    struct Base {
        // 创建一个虚函数
        virtual void bar() { std::cout << "Base::bar()
    "; }
        virtual ~Base() = default;
        
        std::string val;
    };
    
    struct Derived : Base {
        Derived() { std::cout << "Derived::Constructor
    "; }
        ~Derived() { std::cout << "Derived::Descontructor
    "; }
        void bar() override { std::cout << "Derived::bar()
    "; }
    
        std::string val;
    };
    
    int main()
    {
        std::cout << "
    unique_ptr 指向对象的所有权的测试---->
    ";
        {
            // ptr_Derived拥有对象的所有权
            auto ptr_Derived = std::make_unique<Derived> ();
            ptr_Derived->val = "unique_ptr";
            auto ptr_MoveD = std::move(ptr_Derived);    //ptr_Derived 不在拥有对象所有权
    
            assert(!ptr_Derived);    //ptr_Derived为empty
            ptr_MoveD->bar();
            std::cout << ptr_MoveD->val << std::endl;
            // 这里将会调用一次Derived的析构函数
        }
    
        std::cout << "
    多态运行时测试----->
    ";
        {
            std::unique_ptr<Base> p_base = std::make_unique<Derived>();    // p_base是指向基类的指针,但是占有D的unique_ptr
            p_base->bar();    // 这里将调用的Derived的bar函数
    
            std::vector<std::unique_ptr<Base>> v;    // 容器也可以存储unique_ptr对象
    
            v.push_back(std::move(p_base));
            v.push_back(std::make_unique<Derived>());
            v.emplace_back(new Derived);
    
            for (auto& itr : v)
            {
                itr->bar();
            }
    
            // 这里将调用3次析构函数 
        }
    
        std::cout << "
    数组形式的unique_str对象测试--->
    ";
        {
            std::unique_ptr<Derived[]> parr{ new Derived[4] };
            // 这里将调用4次析构函数
        }
        return 0;
    }
    

    运行结果

    unique_ptr 指向对象的所有权的测试---->
    Derived::Constructor
    Derived::bar()
    unique_ptr
    Derived::Descontructor
    
    多态运行时测试----->
    Derived::Constructor
    Derived::bar()
    Derived::Constructor
    Derived::Constructor
    Derived::bar()
    Derived::bar()
    Derived::bar()
    Derived::Descontructor
    Derived::Descontructor
    Derived::Descontructor
    
    数组形式的unique_str对象测试--->
    Derived::Constructor
    Derived::Constructor
    Derived::Constructor
    Derived::Constructor
    Derived::Descontructor
    Derived::Descontructor
    Derived::Descontructor
    Derived::Descontructor
    
  • 相关阅读:
    Java基础教程
    一个RDBMS左连接SQL执行计划解析
    hive时间日期函数及典型场景应用
    ETL数据采集方法
    数据仓库保存历史数据方法之拉链表
    NAS服务器局域网内IPad、手机、电视盒子等联网播放
    转:主流数据恢复软件——EasyRecovery/Ashampoo Undeleter/Wise Data Recovery/Recuva/Undelete 360
    [转]office2010一直卡在“正在受保护的视图中打开”
    [转]PROE传动链条的装配教程
    linux下svn定时更新项目
  • 原文地址:https://www.cnblogs.com/zuixime0515/p/12934591.html
Copyright © 2011-2022 走看看