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

2018-07-17  本文已影响0人  _gentle

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;
}

指定删除器

#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));
}
上一篇下一篇

猜你喜欢

热点阅读