美文网首页
c++11智能指针(二) unique_ptr

c++11智能指针(二) unique_ptr

作者: _gentle | 来源:发表于2018-07-17 11:05 被阅读0次

    unique_ptr是一个独占指针,它不允许其他的智能指针共享其内部的指针。例如

    初始化unique_ptr

    #include<iostream>
    #include<memory>
    //普通指针 
    template<class T, class... Args> inline
    typename std::enable_if<!std::is_array<T>::value, std::unique_ptr<T>>::type
    make_unique(Args&&... args) {
        return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
    }
    
    //动态数组
    template<class T> inline
    typename std::enable_if<std::is_array<T>::value && std::extent<T>::value == 0, 
                            std::unique_ptr<T>>::type
    make_unique(size_t size) {
        //若 T 是某类型 X 的数组,则提供等于 X 的成员 typedef type ,否则 type 为 T 。 
        typedef typename std::remove_extent<T>::type U;
        return std::unique_ptr<T>(new U(size));
    }  
    //过滤掉定长数组的情况
    template<class T, class... Args>
    typename std::enable_if<std::extent<T>::value != 0, 
              void>::type make_unique(Args&&...) = delete;
    
    int main(){
         std::unique_ptr<int> uptr(new int);
        // std::unique_ptr<int> uptr2 = uptr; //error  
        std::unique_ptr<int> uptr3 = std::move(uptr);//改变原指针的所有权
        //指向数组 
        std::unique_ptr<int[]> uptr4(new int[10]);
        uptr4[4] = 1;
        
        
        std::unique_ptr<int[]> uptr5 = make_unique<int[]>(5);
        uptr5[4] = 2; 
        std::cout << uptr5[4] << std::endl;
    }
    

    指定删除器

    • unique_ptr的删除器必须指定类型,因此无法想shared_ptr那样使用lamda表达式(除非能够转化为函数指针)。
      如:
    #include<iostream>
    #include<memory>
    
    struct MyDeleter {
        void operator()(int* p) {
            std::cout << "delete" << std::endl;
            delete p;
        }
        
    };
    int main(){
        //能够转化为函数指针 
        std::unique_ptr<int, std::function<void(int*)>> uptr(new int(1), 
           [&](int* p){
             std::cout << "delete in lamda" << std::endl; 
              delete p;
           });
        std::unique_ptr<int, MyDeleter> uptr2(new int(2));
    }
    

    相关文章

      网友评论

          本文标题:c++11智能指针(二) unique_ptr

          本文链接:https://www.haomeiwen.com/subject/gclipftx.html