zoukankan      html  css  js  c++  java
  • 智能指针std::unique_ptr

    std::unique_ptr

    1.特性

    1) 任意时刻unique_ptr只能指向某一个对象,指针销毁时,指向的对象也会被删除(通过内置删除器,通过调用析构函数实现删除对象)

    2)禁止拷贝和赋值(底层实现拷贝构造函数和复制构造函数 = delete),可以使用std::move()、unique_ptr.reset(...) 转移对象指针控制权。

    (由1决定,指针发生了拷贝就违反了第一条)

    2.怎么实现禁止拷贝构造和赋值构造?

    拷贝构造 和 赋值符‘=’ 对应函数 被删除了,所以用不了。  (看下面的构造函数表)

    default (1)
    constexpr unique_ptr() noexcept;
    
    from null pointer (2)
    constexpr unique_ptr (nullptr_t) noexcept : unique_ptr() {}
    
    from pointer (3)
    explicit unique_ptr (pointer p) noexcept;
    
    from pointer + lvalue deleter (4)
    unique_ptr (pointer p,
        typename conditional<is_reference<D>::value,D,const D&> del) noexcept;
    
    from pointer + rvalue deleter (5)
    unique_ptr (pointer p,
        typename remove_reference<D>::type&& del) noexcept;
    
    move (6)
    unique_ptr (unique_ptr&& x) noexcept;
    
    move-cast (7)
    template <class U, class E>
      unique_ptr (unique_ptr<U,E>&& x) noexcept;
    
    move from auto_ptr (8)
    template <class U>
      unique_ptr (auto_ptr<U>&& x) noexcept;拷贝构造

    拷贝构造     

    copy (deleted!) (9)

    unique_ptr (const unique_ptr&)= delete;
    复制作业(删除!)(4)
    unique_ptr&operator =(const unique_ptr&)= delete;

    可以在IDE/编辑器中查看详细实现:(下面是 GNU  g++的实现)

     

    我们可以看到,拷贝和赋值函数被禁止实现(禁用)了。

    更加详细的内容参阅cppreference:

    ① std :: unique_ptr 构造   

    ② 赋值  


    3. 使用

     1 #include <iostream>
     2 #include <memory>
     3 using namespace std;
     4 
     5 // unique_ptr::get vs unique_ptr::release
     6 int main() 
     7 {
     8     std::unique_ptr<int> foo; //foo - null
     9     std::unique_ptr<int> bar; //bar - null
    10     int* p = nullptr;
    11     foo = std::unique_ptr<int>(new int(100));// foo - 100
    12     bar = std::move(foo); // foo转移给bar bar - 100 foo - null
    13     p = bar.get(); // p - 100 smart pointer.get()返回一个指向该对象的内置指针
    14     foo.reset(bar.release()); // bar 放弃指针控制权,返回指针给foo foo - 100, bar已经不存在
    15 
    16     cout << "foo : " << *foo << endl;
    17     cout << "p   : " << *p << endl;
    18     delete p; //记得删除,这也是使用智能指针的初衷之一---防止内存泄漏!!!
    19 
    20     if (bar)
    21         cout << "bar : " << *bar << endl;
    22     else
    23         cout << "bar已经被释放" << endl; //这里bar已经销毁了,可能会报错。
    24 
    25     return 0;
    26 }
  • 相关阅读:
    python---装饰器用法小结
    python---mysql事务
    python---sql语句集体更改数据
    python多继承中的深度优先与广度优先
    python---copy
    vue 主次页面区分
    css 过渡动画
    android web外壳
    cordova 打包 守护进程无法启动
    JavaScript 原生控制元素添加删除
  • 原文地址:https://www.cnblogs.com/yocichen/p/10561615.html
Copyright © 2011-2022 走看看