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));
}
网友评论