shared_ptr与unique_ptr之间的明显不同是它们保存指针的策略,另一个不同是它们允许用户重载默认删除器的方式.
shared_ptr将删除器以指针的方式存储,而unique_ptr则将它作为自己类型的一部分.
[练习]:编写自己的shared_ptr类与unique_ptr类
用fuction可以接受所有的可调用对象.
#include "iostream"
#include "DebugDelete.h"
#include "functional"
template <typename T>
class shared_pointer
{
using Dtype = function<void(T*)>;
public:
/**********默认构造函数****************/
shared_pointer() = default;
/**********接受内置指针的构造函数****************************/
shared_pointer(T* p) :data(p), use(new int(1)),del(nullptr){}
/************接受内置指针,以及一个删除器的构造函数******/
shared_pointer(T* p, Dtype d) :data(p), use(new int(1)), del(new Dtype(d)){}
/*************拷贝构造函数*****************/
shared_pointer(const shared_pointer& p){
data = p.data;
use = p.use;
}
/**************赋值运算符**************************/
shared_pointer& operator=(const shared_pointer& s){
if (this != &s)
{
free();
data = p.data;
use = p.use;
++*use;
}
}
/**************定义*************************/
T operator*()const{ return *data; }
/*************定义-〉************************/
T* operator->()const{ return & this->operator*(); }
/*************析构函数*****************/
~shared_pointer(){ free(); }
/************reset函数**********************/
void reset(T* q, Dtype& d){do_ret(q, &d); }
void reset(T* q){ do_ret(q,nullptr); }
void reset(){ do_ret(nullptr,nullptr); }
/****************定义size()*******************/
size_t size()const { return (*data).size(); }
private:
void free(){
if (--*use == 0)
{
del ? (*del)(data):delete(data);
delete(use);
}
if (del)
delete(del);
}
void do_ret(T* q, Dtype* d) {
free();
data = q;
del = d;
}
int *use = nullptr;
T* data= nullptr;
Dtype* del = nullptr;
};
/************unqiue_ptr的模板************/
template<typename T,typename Dtype = function<void (T*)>>
class unique_pointer
{
public:
unique_pointer() = default;
explicit unique_pointer(T* p) :data(p){}
unique_pointer(T*p, Dtype d) :data(p),del(d){}
/************定义移动拷贝操作****************/
unique_pointer(unique_pointer && u) : data(u.data), del(u.del) { u.data = nullptr; }
/************定义移动赋值操作*************************************/
unique_pointer& operator=(unique_pointer&& u){
if (this != &u)
{
free();
data = u.data;
del = u.del;
u.data = nullptr;
}
return *this;
}
/************阻止拷贝和赋值*******************/
unique_pointer(const unique_pointer&) = delete;
unique_pointer& operator=(const unique_pointer&) = delete;
/************析构函数********************************/
~unique_pointer(){free(); }
/**************reset********************/
void reset(T* q = nullptr){ data = q;}
/**************release********************/
T* release(){
auto ret = data;
data = nullptr;
return ret;
}
private:
void free(){ del(data); }
T* data = nullptr;
Dtype del = DebugDelete();
};