智能指针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()\n"; }
    virtual ~Base() = default;
    
    std::string val;
};

struct Derived : Base {
    Derived() { std::cout << "Derived::Constructor\n"; }
    ~Derived() { std::cout << "Derived::Descontructor\n"; }
    void bar() override { std::cout << "Derived::bar()\n"; }

    std::string val;
};

int main()
{
    std::cout << "\nunique_ptr 指向对象的所有权的测试---->\n";
    {
        // 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 << "\n多态运行时测试----->\n";
    {
        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 << "\n数组形式的unique_str对象测试--->\n";
    {
        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

猜你喜欢

转载自www.cnblogs.com/zuixime0515/p/12934591.html
今日推荐