定制删除器其实是利用仿函数
一、仿函数是什么?
不是函数但可以像函数一样使用,因为重载了operator()
简单举例:
template<class T>
struct Less
{
bool operator()(const T& l, const T& r)
{
return l < r;
}
};
void Test2()
{
Less<int>less1;
cout << less1(1, 2) << endl;
}
二、具体场景
void Teat()
{
shared_ptr<FILE>spl((FILE*)fopen("test.txt", "w"));
}
上述场景中将产生错误,因为用fopen打开,要用fclose关闭
三、定制删除器举例
代码如下:
template<class T>//注意这里有模版
struct Del
{
void operator()(const T* ptr)
{
delete ptr;
}
};
struct Free//注意这里没有模版
{
void operator()(void* ptr)
{
free(ptr);
}
};
struct Fclose
{
void operator()(FILE* ptr)
{
fclose(ptr);
}
};
template<class T,class Deleter=Del<T>>
class SharedPtr
{
public:
SharedPtr(T* ptr, Deleter del)
:_ptr(ptr)
, _pCount(new long(1))
, _del(del)
{}
SharedPtr(T* ptr)
:_ptr(ptr)
, _pCount(new long(1))
{}
~SharedPtr()
{
_Release();
}
protected:
void _Release()
{
if (--*_pCount == 0)
{
_del(_ptr);
delete _pCount;
}
}
private:
T* _ptr;
long* _pCount;
Deleter _del;
};
测试用例:
void Test()
{
SharedPtr<int>sp1(new int(1));
SharedPtr<int,Free>sp2((int*)malloc(sizeof(int) * 10), Free());//注意怎么调用的
}