所谓定制删除器,就是向目标模板提供一个可以自由选择析构的接口,这样做的好处就是可以使智能指针模板不再只能单独管理内存,我们还可以用它管理文件指针之类的东西。其实现方法有两种,这里我们以share指针为例。
1.传递一个类的模板参数并给出缺省值,模板中将该类设定为成员变量,通过该类(删除类)的实例化,调用类中所存的删除方法进行删除。
代码如下:
#include<iostream> template <class T> struct Del { void operator ()(const T*ptr) { if (ptr) { delete ptr; } } }; struct Free { void operator() (void* ptr) { cout << "free:" << ptr << endl; free(ptr); } }; struct Close { void operator()(void *ptr) { cout << "Close" << endl; fclose((FILE*)(ptr)); } }; template<class T, class Deleter = Del<T>> class SharedPtr { public: SharedPtr(T* ptr) :_ptr(ptr) , _pCount(new long(1)) {} SharedPtr(T* ptr, Deleter del) :_ptr(ptr) , _pCount(new long(1)) , _del(del) {} ~SharedPtr() { _Release(); } SharedPtr(const SharedPtr<T>& sp) :_ptr(sp._ptr) , _pCount(sp._pCount) { ++(*_pCount); } //SharedPtr<T>& operator=(const SharedPtr<T>& sp)//传统写法 //{ // if (this != &sp) // { // this->_Release(); // _pCount = sp._pCount; // _ptr = sp._ptr; // ++(*_pCount); // } // return *this; //} SharedPtr<T>& operator=(SharedPtr<T> sp) { swap(_ptr, sp._ptr); swap(_pCount, sp._pCount); return *this; } T& operator*() { return *_ptr; } T* operator->() { return _ptr; } T* GetPtr() { return _ptr; } long GetCount() { return *_pCount; } protected: void _Release() { if (--(*_pCount) == 0) { //delete _ptr; _del(_ptr); delete _pCount; } } protected: T* _ptr; long* _pCount; Deleter _del; };
测试用例如下:
void Test2() { SharedPtr<int> sp1(new int(1)); SharedPtr<int, Free> sp2((int*)malloc(sizeof(int)* 10), Free()); SharedPtr<FILE, Close>sp3 = std::fopen("Test.txt", "w"); }
2.在智能指针的模板中,添加函数指针变量,通过构造函数确定所传递的函数指针,用该指针所指向的方法进行删除。
代码如下:
void free() { cout << "void free()" << endl; } void del() { cout << "void del()" << endl; } void close() { cout << "void close()" << endl; } template<class T> class SharedPtr { public: SharedPtr(T* ptr) :_ptr(ptr) , _pCount(new long(1)) {} SharedPtr(T* ptr, void(*p)()) :_ptr(ptr) , _pCount(new long(1)) , del(p) { } ~SharedPtr() { _Release(); } SharedPtr(const SharedPtr<T>& sp) :_ptr(sp._ptr) , _pCount(sp._pCount) { ++(*_pCount); } SharedPtr<T>& operator=(SharedPtr<T> sp) { swap(_ptr, sp._ptr); swap(_pCount, sp._pCount); return *this; } T& operator*() { return *_ptr; } T* operator->() { return _ptr; } T* GetPtr() { return _ptr; } long GetCount() { return *_pCount; } protected: void _Release() { if (--(*_pCount) == 0) { del(); delete _pCount; } } protected: T* _ptr; long* _pCount; void(*del)(); };
测试用例如下:
void Test1() { void(*p)(); int a = 0; SharedPtr<int>p1(&a, close); }
如有什么不足或疑问,希望留言一起探讨,如有不择也希望批评指正。
本文出自 “pawnsir的IT之路” 博客,请务必保留此出处http://10743407.blog.51cto.com/10733407/1757336
原文地址:http://10743407.blog.51cto.com/10733407/1757336