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

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

初始化unique_ptr

#include
#include
//普通指针 
template inline
typename std::enable_if::value, std::unique_ptr>::type
make_unique(Args&&... args) {
    return std::unique_ptr(new T(std::forward(args)...));
}

//动态数组
template inline
typename std::enable_if::value && std::extent::value == 0, 
                        std::unique_ptr>::type
make_unique(size_t size) {
    //若 T 是某类型 X 的数组,则提供等于 X 的成员 typedef type ,否则 type 为 T 。 
    typedef typename std::remove_extent::type U;
    return std::unique_ptr(new U(size));
}  
//过滤掉定长数组的情况
template
typename std::enable_if::value != 0, 
          void>::type make_unique(Args&&...) = delete;

int main(){
     std::unique_ptr uptr(new int);
    // std::unique_ptr uptr2 = uptr; //error  
    std::unique_ptr uptr3 = std::move(uptr);//改变原指针的所有权
    //指向数组 
    std::unique_ptr uptr4(new int[10]);
    uptr4[4] = 1;
    
    
    std::unique_ptr uptr5 = make_unique(5);
    uptr5[4] = 2; 
    std::cout << uptr5[4] << std::endl;
}

指定删除器

  • unique_ptr的删除器必须指定类型,因此无法想shared_ptr那样使用lamda表达式(除非能够转化为函数指针)。
    如:
#include
#include

struct MyDeleter {
    void operator()(int* p) {
        std::cout << "delete" << std::endl;
        delete p;
    }
    
};
int main(){
    //能够转化为函数指针 
    std::unique_ptr> uptr(new int(1), 
       [&](int* p){
         std::cout << "delete in lamda" << std::endl; 
          delete p;
       });
    std::unique_ptr uptr2(new int(2));
}

你可能感兴趣的:(c++11智能指针(二) unique_ptr)