unique_ptr是一個獨(dú)占指針贮缅,它不允許其他的智能指針共享其內(nèi)部的指針赖淤。例如
初始化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)...));
}
//動態(tài)數(shù)組
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 的數(shù)組精钮,則提供等于 X 的成員 typedef type 鼓拧,否則 type 為 T 甘邀。
typedef typename std::remove_extent<T>::type U;
return std::unique_ptr<T>(new U(size));
}
//過濾掉定長數(shù)組的情況
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);//改變原指針的所有權(quán)
//指向數(shù)組
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表達(dá)式(除非能夠轉(zhuǎn)化為函數(shù)指針)癣缅。
如:
#include<iostream>
#include<memory>
struct MyDeleter {
void operator()(int* p) {
std::cout << "delete" << std::endl;
delete p;
}
};
int main(){
//能夠轉(zhuǎn)化為函數(shù)指針
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));
}