美文网首页
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++:一文读懂智能指针

    智能指针 C++11 引入了 3 个智能指针类型: std::unique_ptr :独占资源所有权的指针。...

  • std::unique_ptr使用

    1 引言 std::unique_ptr是c++11起引入的智能指针,为什么必须要在c++11起才有该特性,主要还...

  • 智能指针

    关键点## RAII机制 C++操作符重载 参考链接## C++11智能指针之unique_ptr shared_...

  • C++11智能指针(shared_ptr)

    智能指针在C++11版本之后提供,包含在头文件中,shared_ptr、unique_ptr、we...

  • C++智能指针作为成员变量

    C++11为我们提供了shared_ptr、unique_ptr和weak_ptr这三种智能指针帮助我们更方便安全...

  • C++11 新特性之智能指针

    这是C++11新特性介绍的第五部分,涉及到智能指针的相关内容(shared_ptr, unique_ptr, we...

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

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

  • C++11智能指针:unique_ptr

    unique_ptr 1.概念 unique_ptr形如其名,与所指对象的内存紧密地绑定,不能与其他的unique...

  • C++11智能指针

    [C++11]智能指针 C++11包括了三种智能指针: shared_ptr weak_ptr unique_pt...

  • C++11智能指针

    智能指针 unique_ptr shared_ptr weak_ptr 在C98中,智能指针通过一个模...

网友评论

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

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