• 智能指针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
    
  • 相关阅读:
    企业老板怎么获得战略视野及组织管理能力?看这些管理书籍就行 了
    公司管理者必读的5本经典书籍推荐
    如何提升自己的领导能力?
    如何培养自己的商业思维能力?
    口才训练书籍推荐
    公司管理课程,我推荐12Reads系列
    比较好的管理学书籍推荐
    如何自学企业管理?你需要看这些书
    DMZ主机实现
    inotify+rsync实现文件即使备份
  • 原文地址:https://www.cnblogs.com/zuixime0515/p/12934591.html
Copyright © 2020-2023  润新知